当前位置:  技术问答>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++肯定会有机制来保证不会重复实现的。
有没有人遇到过这种情况?该如何解决呢?

谢谢~




|
这个当然会重复喽!#ifdef这样的指令仅仅是用来防止重复包含的,但是实际上你没有重复包含,那么这些指令当然没有作用喽。

而且你编写A中的自定义类的时候没有把成员函数在类中定义。如果定义在类中,函数属性将会变成内联函数,这样的话链接器就不会报错了。建议你到C/C++去讨论这个问题,这个和Linux/Unix关系不是很大,目前C/C++的编译器采用的编译模型都是如此的,并不仅仅是g++这样,就算用M$的编译器,也会出现同样的问题。

解决方法是把A类里面的函数定义显式定义为inline的,或者把A中的函数定义放入另外一个.cpp文件中,这样就不会有问题了。

    
 
 

您可能感兴趣的文章:

  • 为什么我用GCC编译后,在源文件中定义的宏被修该了?(产生编译错误)
  • 如何在Makefile中定义宏进行条件编译?
  • gcc/g++中可不可以在编译选项中预定义宏
  • xlc编译最后链接时出现未定义的问题
  • 可能是迭代的宏定义编译器不认
  • 为什么我定义的类 总被编译程序提示要求 改为抽象类型?
  • 宏定义里面不能再包含条件编译语句吗?见内容
  • 编译arm版prelink出错,elf_与gelf_的库函数全部没有定义
  • 我用的是atmel一个成熟的开发板。有一个触摸屏驱动程序,以<M>的方式编译为模块,编译时提示某个外部函数没有定义,但如果以<*>的方式编译进内核,则不会出错。请教下可能是什么原因?
  • 如何在linux下定义一个64位的整型变量,并进行输出,用GCC编译
  • Makefile,如何传递宏定义DEBUG?以便于程序编译或者跳过程序中#ifdef DEBUG中间的代码段?
  • 我想把大写转换成小写为什么我#include <string.h>后用strlwr()编译提示找不到strlwr()的定义?应该用什么函数呀?
  • GCC编译程序时,有自定义头文件,提示找不到该头文件,但他就在这个目录中,如何设置GCC参数?
  • 已经包含了unistd.h,gcc编译时仍报错未定义pid_t结构体
  • gcc中是否有VS编译器中预定义的类似__FUNCDNAME__宏??
  • xlc编译遇到重复定义
  • linux下编译程序通不过,提示libcurses.so:中有个啥没有定义。求高手指点
  • 如何去编译循环定义??
  • Socket程序--编译后提示未定义标识?
  • 最近看apue,程序4-10中,编译时,使用两个宏major和minor来访问主次设备号,没有定义是怎么回事,应该怎么解决呢?
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • PROC开发时 //注释编译不通过 如何设置使用cpp编译。 iis7站长之家
  • 急急!!跪求mplayer的编译过程(我的命令行下可以播放,加皮肤不能播)
  • 求一个讲g++从预处理到编译完成全过程的电子书
  • 请问 ubuntu下怎么编译gcc,谁有详细的过程,能否说一下
  • 编译过程中编译器和链接器为什么不一样啊?
  • 关于java编译过程中的bug说明
  • Linux内核编译过程?
  • debian编译过程出错求助,很急
  • 在安装xen到过程中 编译安装后为什么没有生成vmlinuz-2.6.18.8-xen
  • Linux7.3.2内核编译通过,但引导过程失败!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 请教:JSP编译器编译成字节码,跟别的编译器编译出来的有什么不同呢?
  • 高速的网络抓包库PF_ring介绍及编译安装
  • 编译GCC时能不能只编译C/C++的编译器?
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题
  • JB下,我的程序编译得好慢!请问用什么方法编译才可以快一点?或编译顺序改变一下?
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • 问:关于gcc编译器和g++编译器
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 在cygwin编译驱动程序要不要交叉编译?
  • 关于如何把编译进内核的编译成模块
  • C编译器 c++编译器 wieldylcc
  • Linux下gcc编译时,如何以静态链接的形式编译?
  • PROC开发时 //注释编译不通过 如何设置使用cpp编译。
  • 编译失败后如何再继续编译
  • 编译qt-x11,最后编译生成可执行文件时候,make出错
  • 如何查看已编译安装软件的编译命令行
  • 请问哪里有反编译.class文件的反编译器?
  • 用Jdk编译时出现提示要加 -deprecation 再编译,请教??
  • linux下有没有能编译出16bit代码的C语言编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3