当前位置: 技术问答>linux和unix
QT编译问题:link过程重复定义
来源: 互联网 发布时间:2015-09-10
本文导语: A类:自定义类。 a.h中实现。 B类、C类为Qt类的派生类,其中均含A类成员。b.ui、c.ui生成b.h、b.cpp、c.h、c.cpp实现。 编译时没问题,连接时出现a类重复定义错误:moc_b.o和c.o均实现了a类。 我对这种错误的理解: B、C...
A类:自定义类。 a.h中实现。
B类、C类为Qt类的派生类,其中均含A类成员。b.ui、c.ui生成b.h、b.cpp、c.h、c.cpp实现。
编译时没问题,连接时出现a类重复定义错误:moc_b.o和c.o均实现了a类。
我对这种错误的理解:
B、C类均各自包含a.h,编译各自根据h和cpp文件生成moc_b.o/c.o时不存在问题,但将二者
连接成main的时候,则发生A类的重复实现,出现连接错误。
头文件均使用#ifndef #define #endif结构,不存在重复include问题(存在也会在编译阶段发现)
这个问题是不是因为g++编译时自底向上编译,在底层的时候没有检查依赖或名字空间造成的?
还是因为编译过程中多了个moc中间过程造成的?
也没有找到类似的例程参考,逻辑上qt或者g++肯定会有机制来保证不会重复实现的。
有没有人遇到过这种情况?该如何解决呢?
谢谢~
B类、C类为Qt类的派生类,其中均含A类成员。b.ui、c.ui生成b.h、b.cpp、c.h、c.cpp实现。
编译时没问题,连接时出现a类重复定义错误:moc_b.o和c.o均实现了a类。
我对这种错误的理解:
B、C类均各自包含a.h,编译各自根据h和cpp文件生成moc_b.o/c.o时不存在问题,但将二者
连接成main的时候,则发生A类的重复实现,出现连接错误。
头文件均使用#ifndef #define #endif结构,不存在重复include问题(存在也会在编译阶段发现)
这个问题是不是因为g++编译时自底向上编译,在底层的时候没有检查依赖或名字空间造成的?
还是因为编译过程中多了个moc中间过程造成的?
也没有找到类似的例程参考,逻辑上qt或者g++肯定会有机制来保证不会重复实现的。
有没有人遇到过这种情况?该如何解决呢?
谢谢~
|
这个当然会重复喽!#ifdef这样的指令仅仅是用来防止重复包含的,但是实际上你没有重复包含,那么这些指令当然没有作用喽。
而且你编写A中的自定义类的时候没有把成员函数在类中定义。如果定义在类中,函数属性将会变成内联函数,这样的话链接器就不会报错了。建议你到C/C++去讨论这个问题,这个和Linux/Unix关系不是很大,目前C/C++的编译器采用的编译模型都是如此的,并不仅仅是g++这样,就算用M$的编译器,也会出现同样的问题。
解决方法是把A类里面的函数定义显式定义为inline的,或者把A中的函数定义放入另外一个.cpp文件中,这样就不会有问题了。
而且你编写A中的自定义类的时候没有把成员函数在类中定义。如果定义在类中,函数属性将会变成内联函数,这样的话链接器就不会报错了。建议你到C/C++去讨论这个问题,这个和Linux/Unix关系不是很大,目前C/C++的编译器采用的编译模型都是如此的,并不仅仅是g++这样,就算用M$的编译器,也会出现同样的问题。
解决方法是把A类里面的函数定义显式定义为inline的,或者把A中的函数定义放入另外一个.cpp文件中,这样就不会有问题了。