天天看點

避免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表示單詞分隔。

繼續閱讀