慘痛的教訓,編譯程式時一定要注意c執行時庫的選擇

2021-08-26 06:35:40 字數 1033 閱讀 8834

關於c執行時庫的基本知識可以自行google。

基本上我們進行選擇的c執行時庫有4個,對應於vc中c/c++---code generation--runtime library中的4個標誌。

multithread(static link) libcmt.lib

debug multithread(static link) libcmtd.lib

multithread(dynamic link) msvcrt.lib

debug multithread(dynamic link) msvcrtd.lib

即靜態c執行時庫(lib),和動態c執行時庫(dll,msvcrt.lib是匯出庫),和其對應的debug版本。

使用靜態c執行時庫的好處是不需要依賴特定的dll,即便使用者沒有裝執行時庫也可以執行程式。壞處是程式檔案稍大。

使用動態c執行時庫的好處是程式檔案較小,並且假如微軟公升級了c執行時庫(比如修正某些bug),我們不需要重新編譯程式。

具體使用動態或是靜態其實沒有太大關係,但是有一點需要明確,那就是一旦我們選擇好使用c執行時庫的方式,那麼所有與程式相關的依賴庫都要使用相同的c執行時庫。我們編譯boost或者qt等庫的時候,就有專門的選項配置這個。如果選擇的執行時庫不一致的話,vc會給出警告,告訴我們庫有衝突。如果置之不理,那程式執行的時候可能就會出現非常詭異的崩潰。如果因為某些原因實在無法保持一致,那麼也一定要在linker--input---ignore specific default libraries中新增好要忽略的c執行時庫。否則兩個版本的執行時庫共同使用,發生記憶體錯誤簡直是必然的。(比如,使用release版本的執行時庫分配記憶體,卻使用debug版本的執行時庫釋放這塊兒記憶體)

我一開始沒有注意這個問題,程式的乙個依賴庫選擇的是msvcrt.lib(release版本),程式本身選擇的是msvcrtd.lib(debug)版本,結果就導致程式退出的時候總發生莫名奇妙的崩潰。一除錯發現是c執行時庫退出程式的時候清理堆記憶體發生錯誤,但是無論怎麼修改程式**都無法解決問題。直到無意間發現這個warning,新增了忽略依賴庫msvcrt.lib,才解決這個問題。

慘痛的教訓,編譯程式時一定要注意c執行時庫的選擇

關於c執行時庫的基本知識可以自行google。基本上我們進行選擇的c執行時庫有4個,對應於vc中c c code generation runtime library中的4個標誌。multithread static link libcmt.lib debug multithread static ...

linq to sql一定要注意的地方!

注意,在使用datacontext物件時,它會產生資料快取,也就是為了提高讀取資料速度,它會將資料庫物件進行快取,或者返回為iqueryable結果集,使資料查詢結果持續到需要得到資料的時間才去真正的select 動作。如果希望datacontext物件每次取資料時,都從資料庫中得到資料,即sele...

店鋪的安全問題一定要注意

對於 商家來說,質量是產品的第一大關。上同款式的東西多不勝數,高低都有,一般 較貴且 的都是非常具有競爭力的。很多商家會去模仿,買家會對產品進行比較。只要你的質量過關,肯定會有回頭客的。內有很多店鋪,新店商家剛開始可能為了較少投入成本開支,會和一些 便宜的快遞公司合作。但這樣的快遞公司在產品運輸,速...