最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 问题解决: multiple definition of XXX

    编译程序的时候,遇到了1个问题,花点时间记录1下:

    在Qt中创建1个类后,1般是先在.h文件中声明变量与函数,然后在对应的.cpp文件中对各个函数进行定义,这在平常使用中没有任何问题,今天在使用Qt时,在各.cpp源文件编译时出现了许多multiple definition of XXX的毛病:

    这里写图片描述

    搜索了网上1些资料,总算是解决multiple definition of 的方法:

    问题解决方法之1:

    根据网上的解释,multiple definition of 缘由是由于在屡次包括global.h时重复定义了变量和函数。问题是检查进程序后,发现其实不存在重复定义的变量和函数,在1条论坛评论中尝试了1种简单粗鲁的方法……以Qt项目为例,在项目的Debug文件夹中找到编译时生成的o文件,如:

    这里写图片描述

    c和c++编译.c,cpp文件,每一个文件都生成.o文件,再把所有的.o文件链接成最后的履行程序,若o文件有问题,是没法生成履行文件的。将已存在的o文件删除之,重新编译并生成新的o文件,结果在没有其他问题的情况下成功生成履行程序。(我就是属于这类情况…在确认代码中已无明显毛病时可以1试)

    问题解决方法之2:

    当多个文件包括同1个头文件时,并且你的.h文件里面没有加上条件编译。

    而当多个文件包括同1个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每一个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在1起,由于,文件中有重名变量,因而就出现了重复定义的毛病。

    给每个头文件加上条件编译,避免该文件被屡次援用时被屡次解释,这是个应当是习惯。这个方法会解决大部份低级问题。在创建Qt类时已默许生成条件编译:

    #ifndef TEST_H
    #define TEST_H
    ......
    #endif

    就会独立的解释,然后生成每一个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在1起,由于,文件中有重名变量,因而就出现了重复定义的毛病。

    因此可以给每个头文件加上条件编译,避免该文件被屡次援用时被屡次解释,这是个应当是习惯。这个方法会解决大部份低级问题。

    问题解决方法之3:

    当以上方法无效时,可以把所有的全局变量放入1个头文件 global.h (名字随便起,但要加条件编译)中,每个变量前面加extern,声明1下这些变量将在其它文件中定义。 然后建立1个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();

    然后,让触及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成1个global.o ,然后再和其它文件的.o链接生成可履行文件。

    在1篇文章: http://blog.csdn.net/wu070815/article/details/8781762 中提到的另外一种解决方法:

    在变量前加static,声明成静止变量。
    这个方法虽然可以解决multiple definition的问题,但是却会引发其他问题。
    问题以下:
    3个文件,a.h,a.c,b.c;
    在a.c和b.c 都include了a.h
    在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。
    问题分析:
    static的含义是迫使那个变量只在某个文件可见。
    假定你在头文件定义static x;
    且这个头文件分别被a.c和b.c包括;
    实质是在a.c和b.c里会分别定义1个名字叫x的变量,两个x毫无关系。
    在a.c里修改x,他不会致使b.c里的x变化。
    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » 问题解决: multiple definition of XXX

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级