運行庫鏈接報錯,小知識關於MT/MD

1、報錯示例:

項目.obj : error LNK2005  ......已經在 msvcprtd.lib(MSVCP110D.dll) 中定義

動態鏈接庫.lib  : error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: .....不匹配值“MTd_StaticDebug”

MSVCRTD.lib(MSVCR110D.dll) : error LNK2005: .....已經在 LIBCMTD.lib(dbgfree.obj) 中定義

LINK : warning LNK4098: 默認庫“MSVCRTD”與其他庫的使用衝突

2、運行庫代碼生成方式:MT/MD

問題介紹:/MT和/MD 是項目屬性/配置屬性/C/C++/多線程代碼生成的一個選項,如果第三方lib的生成和引用了這些庫的工程生成方式不一致的話就會造成鏈接錯誤。

運行庫:程序在運行時所需要的庫文件。

MT,靜態庫鏈接,把程序所用到的運行庫編譯到project的obj文件當中,把靜態庫中所有函數全部鏈接到目標文件。

效果:輸出文件中包含鏈接庫信息,輸出文件體積較大,對運行環境的依賴性小。

MD, 動態庫鏈接,運行庫作爲DLL文件在程序運行時動態加載。

效果:輸出文件體積較小,對運行環境要求較嚴格。更換運行環境需要把相關DLL文件拷貝過去。

其它:MTd:MT調試版。MDd:MD調試版。

總結:如果項目中使用了第三方.lib文件,那麼這些編譯生成這些.lib文件的生成庫方式(MT/MD)和項目應該是相同的。如果不同,極有可能會出現鏈接錯誤。運行庫不同時,應找同一運行庫編譯的.lib文件對應版本,或者使用源代碼重新編譯需要版本。

3、深入探索運行庫代碼生成

關於多線程MT和MD的區別  https://blog.csdn.net/alisa_xf/article/details/79496113

vc++編譯時運行庫選擇(/MT、/MTd、/MD、/MDd)  https://blog.csdn.net/lwwl12/article/details/77045717?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

VS項目屬性中C/C++運行庫 、MT /MTd /MD /MDd  https://blog.csdn.net/u010059658/article/details/51026662

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章