1. 程式人生 > >關於使用VS2015靜態編譯

關於使用VS2015靜態編譯

首先必須搞清楚專案->專案屬性->配置屬性->C/C++->程式碼生成->執行庫中四個選項的關係:
多執行緒除錯Dll (/MDd) 對應——-MD_DynamicDebug
多執行緒Dll (/MD) 對應————-MD_DynamicRelease
多執行緒(/MT) 對應—————–MD_StaticRelease
多執行緒(/MTd)對應—————-MD_StaticDebug
在msdn中有詳細解釋:
http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.80).aspx

一句話總結就是:D用於動態,T用於靜態,帶d的是debug模式的

。那麼出現類似如下錯誤資訊:

LNK2038 檢測到“_ITERATOR_DEBUG_LEVEL”的不匹配項: 值“0”不匹配值“2”
LNK2038 檢測到“RuntimeLibrary”的不匹配項: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”

一般就是用Release模式去連結了一個Debug編譯出的lib,或者用Debug模式連結了Release編譯的lib。因此先檢查上面的執行庫是否對應正確,release模式一定不能選MDd或MTd的。
若出現下面這種警告資訊:
這裡寫圖片描述
請檢查專案->專案屬性->配置屬性->連結器->輸入->附加依賴項

裡面是否包含了錯誤的lib, 檔名中由d結尾的都是debug模式才能連結,沒有d的只有release模式才能連結。例如,如OpenCV幾個Release編譯的lib:

cv210.lib cvaux210.lib cxcore210.lib highgui210.lib ml210.lib

只能在Release模式下連結,對應的Debug版本就是:

cv210d.lib cvaux210d.lib cxcore210d.lib highgui210d.lib ml210d.lib

(PS:事實上經過測試,我的情況是,release和debug模式下都必須連結不帶d的lib檔案,否則就會出現上述報錯,因此各位還是根據自己的實際情況選擇,網上說的對你不一定適用,僅供參考)
當上面的問題都解決後,又出現下面這個錯誤資訊的話:

error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”

其他參考資料: