天天看点

避免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表示单词分隔。

继续阅读