避免Qt庫引起「過期」lib或obj的問題

2021-09-03 10:54:15 字數 1679 閱讀 6944

前兩天辛辛苦苦用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即可。

現在回過頭來說過程。

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

避免Qt庫引起「過期」lib或obj的問題

前兩天辛辛苦苦用vc express 2005 sp1編譯了三個小時的qt opensource 4.5.1 版本,給同事的vc pro 2005 sp1使用時,他居然遇到嚴重錯誤 編譯生成release配置的時候 fatal error c1047 the object or library fi...

避免更改引起的大量改動

因為所有的操作最終都作用在基表上,因此基表名和列名的變化會對這些語句產生影響,此時必須修改所有的語句,這樣不但麻煩,有時甚至會發生錯誤。另外,有的甚至表名和列名複雜而晦澀,用起來極不方便。怎樣才能解決這個問題呢?避免直接依賴於基表的問題,方法有 使用檢視為表名和列名起別名,在應用過程中可以借助檢視中...

避免過擬合問題 正則化

正則化思想 在損失函式中加入刻畫模型複雜度的指標。優化物件 j r w 其中 j 代表損失函式 代表模型複雜損失在總損失中的比例 r w 代表模型的複雜程度。刻畫模型複雜程度的函式 1.l1正則化 2.l2正則化 原則 通過限制權重的大小,使得模型不能任意擬合訓練資料中的隨機噪音。例子 import...