避免Qt库引起“过期”lib或obj的问题

简介:

前两天辛辛苦苦用VC Express 2005 Sp1编译了三个小时的Qt Opensource (4.5.1)版本,给同事的VC Pro 2005 Sp1使用时,他居然遇到严重错误(编译生成Release配置的时候):

fatal error C1047: The object or library file 'something.obj' was created with an older compiler than other objects; rebuild old objects and libraries

  在研究了一上午之后,终于找到问题之所在,解决了。虽然写这篇博客是为了备忘,不过考虑到有性急的朋友可能参考这篇博客,所以先写结果,之后再描述过程吧。结果,也就是解决方案,很简单,想办法去掉Makefile.Release中的-GL选项,不让Qt在连接时生成代码即可。修改$(QT)/mkspecs/win32-msvc2005/qmake.conf,查找其中的-GL选项(配置在QMAKE_CFLAGS_RELEASE的值中),删掉,保存,重新configure并nmake即可。

  现在回过头来说过程。

  得到错误消息之后,判断是/LTCG连接选项干的事情。所以将它从连接选项去掉(在项目属性→Linker→Optimization→Link Time Code Generation,设置为Default),相应的,还要从编辑器中去掉/GL(在项目属性→C/C++→Optimization→Whole Program Optimization,设置为No)。结果重新编译,仍然得到这个错误,而且还有提示:

something.lib(something.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance

  看来又是M$在自作聪明了。想了一下,既然自己的项目编译已经去掉了这两个属性。那有可能是Qt库编译时加了/GL选项。VC Express 2005 Sp1的编辑器和连接器版本号是14.00.50727.762,而VC Pro 2005 Sp1的则是14.00.50727.42。这就更增加了Qt库编译时加了/GL选项的可能性(这么小的版本差别也要算作版本不一致,郁闷啊),于是进入Qt的src目录,在corelib目录下打开Makefile.Release来观察了一下,果然发现CFLAGS中配置了-GL。

  Makefile.Release是在configure.exe的时候产生的,现在的问题是这个选项是由configure.exe从别的配置中复制过来的还是由configure.exe自己写出来的。如果是configure.exe自己写出来的,那就只能在产生Makefile.Release之后,用脚本一个个找出来改了。这么麻烦的事情我可不想干,于是决定让grepWin帮个忙。

  用grepWin按正则表达式方式搜索“-GL/b”,结果找到一些可疑文件,其中有mkspecs/win32-msvc2005/qmake.conf。这个文件里QMAKE_CFLAGS_RELEASE的值中配置有-GL。于是尝试,删掉-GL,再重新configure。这时候再检查产生的Makefile.Release文件,已经没有-GL选项了。

  我这里虽然研究完了。同事那里也重新编译了Qt,所以我没有再尝试重新编译Qt——太花时间了。再说,开发时一般都是用Debug编译,也不会引起这个问题。Release的时候公司是用了专门的机器进行,只要那上面的Qt库和VC版本一致就行,何况加了/LTCG还能优化生成结果,对发布产品还是有好处的。请有兴趣的朋友自己去试试,有问题我们再交流。

尾注:

① grepWin是TortoiseSVN开发一个窗口方式搜索文件内容的工具,在Windows下挺好用的,推荐。
② 正则表达式-GL/b的意思是搜索后面未紧接着字母或数字的-GL,/B表示单词分隔。



本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/843153,如需转载请自行联系原作者

相关文章
|
21天前
|
编解码
qt中使用dll库的方法
qt中使用dll库的方法
14 2
|
22天前
|
存储
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
|
1月前
|
算法 API C++
Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景
Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景
118 0
|
4月前
|
存储 JSON JavaScript
[Qt5] QJson库进行存储、加载数据
[Qt5] QJson库进行存储、加载数据
21 0
|
4月前
|
C++
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目(二)
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
43 0
|
4月前
|
算法 关系型数据库 编译器
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目(一)
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
68 0
|
6月前
|
编译器 Linux
嵌入式 QT usb camera库驱动摄像头
嵌入式 QT usb camera库驱动摄像头
|
8月前
|
JSON C++ 数据格式
如何通过CMake将Qt库引入C++项目
如何通过CMake将Qt库引入C++项目
253 0
|
8月前
|
XML 数据管理 编译器
Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo
上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好。
|
8月前
|
存储 算法 安全
QT5模板库、工具类及控件
标准C++提供了两种字符串,一种是C语言风格的以“\0”字符结尾的字符数 组,另一种是字符串类string。而Qt字符串类QString功能更强大。
90 0