QTCreator & QT & gcc问题合集(一)

来源:互联网 发布:qq登录代理服务器 mac 编辑:程序博客网 时间:2024/06/04 23:34

1、linker input file unused because linking not done

这是今天做工程时遇到的一个警告。

我编译了一个静态库libjason.a,然后把这个静态库文件和它的头文件jason.h加入到工程目录中。然后,把工程的Makefile文件删除,重新打开QTCreator,在它自动成的Makefile文件的LIBS里面加入libjason.a静态库(形如: -L ./ -ljason),然后编译,便出现上文提示的信息。

这个问题的原因是由两个方面造成的(根据工程的具体环境),首先要搞清楚预处理,编译,链接的作用和之间的关系,再一个就是QTCreator生产Makefile的时候,默认直接把libjason.a加入到了INCPATH路径里边,这样就造成了没有连接就直接使用,导致最终的警告。

解决过程:把INCPATH里的libjason.a删除即可编译成功。

参考文献:

同上问题的另一篇讨论 http://gcc.gnu.org/ml/gcc-help/1999-12n/msg00351.html

解析QT静态库和动态库 http://mobile.51cto.com/symbian-267846.htm

编译与连接的知识 http://blog.chinaunix.net/uid-25808509-id-2743842.html


2、在linux中使用动态共享库,分别为a.so和b.so两个库,其中b.so由a.so调用,a.so由主工程调用。编译都通过,但运行程序时出现如下错误提示:

……symbol lookup error:…….so.1: undefined symbol: _ZN11.....QString

类如下图所示:

初始还以为是我的动态库编写有问题,但仔细查看了几遍,没有什么问题呀,编译也都通过,先编译成功b.so动态库,然后在由a动态库工程调用b.so文件,最终生成的a.so动态库文件。为了省去库文件路径配置的麻烦,我直接放到了/usr/lib里边。但出现问题是,也重新审视了LD_LIBRARY_PATH。但都没问题呀。网上都翻遍了,出现类似问题的很多,但都没能解决我的问题。

再仔细看看问题,最后的那一串 _ZN11VideoDeviceC1E7QString 提示很重要,肯定问题出现在相关VideoDevice(即上面的b.so)的文件里边。仔细查看了a动态库工程的Makefile文件,再查看了主工程的Makefile文件,最终发现问题,也解决了问题。问题表现如下(仔细对比两个文件的差异)

a的Makefile文件:

主工程文件Makefile的写法:


这两种写法不一样,导致在主工程文件生成的可执行文件运行时无法链接到具体的动态库文件。

所以编程习惯和编程规范相当重要,一不留神那就是浪费生命了。

解决问题:把a动态库工程中的Makefile文件里的“ libvideodevice” 修改为 “ -lvideodevice” 即可,然后重新编译生成a.so动态库文件,再放到主工程离去。

参考文献:http://bbs.chinaunix.net/thread-1616529-1-1.html


3、编译错误:undefined reference to `vtable for 

原因一,只声明而没有定义析构函数;

原因二,由于在该类中使用了Q_OBJECT宏的缘故;

参考文献一:http://1108038.blog.51cto.com/1098038/409968

参考文献二:http://blog.csdn.net/yili_xie/article/details/4803482

原创粉丝点击