MD /MDD /ML /MT /MTD的簡單介紹

    在編譯ATL工程後,生成的dll在本電腦上能用,在別人的電腦上不能用。通過Depends工具分析一下,原來是編譯選項沒有選對,別的電腦上沒有我生成的dll需要的基礎dll文件,選成靜態鏈接庫就好了。故而總結一下幾個編譯選項,主要來自於參考1中鏈接網址;當然,更詳細的介紹可以參見參考2microsoft網址上介紹。

1VC編譯選項 多線程(/MT)

多線程調試(/MTd)

多線程 DLL (/MD)

多線程調試 DLL (/MDd)

2C 運行時庫                        庫文件

Single thread(static link) ML            libc.lib

Debug single thread(static link) MLd        libcd.lib

MultiThread(static link) MT            libcmt.lib

Debug multiThread(static link) MTd            libcmtd.lib

MultiThread(dynamic link) MD            msvert.lib

Debug multiThread(dynamic link) MDd        msvertd.lib

3. 各種 C 運行時庫的區別

(1)靜態鏈接的單線程庫

    靜態鏈接的單線程庫只能用於單線程的應用程序,C運行時庫的目標代碼最終被編譯在應用程序的二進制文件中。通過/ML編譯選項可以設置Visual C++使用靜態鏈接的單線程庫。

(2)靜態鏈接的多線程庫

    靜態鏈接的多線程庫的目標代碼也最終被編譯在應用程序的二進制文件中,但是它可以在多線程程序中使用。通過 /MT 編譯選項可以設置 Visual C++ 使用靜態鏈接的多線程庫。

(3)動態鏈接的運行時庫

    動態鏈接的運行時庫將所有的 C 庫函數保存在一個單獨的動態鏈接庫 MSVCRTxx.DLL中,MSVCRTxx.DLL 處理了多線程問題。使用 /MD 編譯選項可以設置 Visual C++ 使用動態鏈接的運行時庫。

/MDd、/MLd 或 /MTd 選項使用 Debug runtime library( 調試版本的運行時刻函數庫 ) ,與 /MD 、 /ML 或 /MT 分別對應。 Debug 版本的 Runtime Library 包含了調試信息,並採用了一些保護機制以幫助發現錯誤,加強了對錯誤的檢測,因此在運行性能方面比不上 Release 版本。

Warning:不要混合使用運行時庫的靜態版本和動態版本。在一個進程中有多個運行時庫副本會導致問題,因爲副本中的靜態數據不與其他副本共享。鏈接器禁止在 .exe 文件內部既使用靜態版本又使用動態版本鏈接,但仍可以使用運行時庫的兩個(或更多)副本。例如,當與用動態 (DLL) 版本的運行時庫鏈接的.exe文件一起使用時,用靜態(非DLL)版本的運行時庫鏈接的動態鏈接庫可能導致問題。(還應該避免在一個進程中混合使用這些庫的調試版本和非調試版本)。

發佈了3 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章