ML MD 等編譯選項區別

2021-09-30 13:14:58 字數 3469 閱讀 4047

c執行時庫                               庫檔案

single thread(static link)              libc.lib

debug single thread(static link)        libcd.lib

multithread(static link)                libcmt.lib

debug multithread(static link)          libcmtd.lib

multithread(dynamic link)               msvcrt.lib

debug multithread(dynamic link)         msvcrtd.lib

c執行時庫包含了c程式執行的最基本和最常用的函式。

c執行時庫除了給我們提供必要的庫函式呼叫之外,它提供的另乙個最重要的功能是為應用程式新增啟動函式。

c執行時庫啟動函式的主要功能為進行程式的初始化,對全域性變數進行賦初值,載入使用者程式的入口函式。

四、編譯器鏈結選項

vc帶的編譯器名字叫cl.exe,它有幾個與標準程式庫有關的選項:/ml、/mld、/mt、/mtd、/md、/mdd。編譯時到底哪個c執行時庫聯入程式取決於這些編譯選項,選項告訴編譯器應用程式想使用什麼版本的c標準程式庫:

/ml對應單執行緒靜態版的標準程式庫(libc.lib);

/mt對應多執行緒靜態版標準庫(libcmt.lib),此時編譯器會自動定義_mt巨集;

/md對應多執行緒dll版(導入庫msvcrt.lib,dll是msvcrt.dll),編譯器自動定義_mt和_dll兩個巨集。

後面加d的選項都會讓編譯器自動多定義乙個_debug巨集,表示要使用對應標準庫的除錯版,因此:

/mld對應除錯版單執行緒靜態標準庫(libcd.lib);

/mtd對應除錯版多執行緒靜態標準庫(libcmtd.lib);

/mdd對應除錯版多執行緒dll標準庫(導入庫msvcrtd.lib,dll是msvcrtd.dll)。

即:/ml 使用libc.lib建立單執行緒可執行檔案

/mld 使用libcd.lib建立除錯單執行緒可執行檔案

/mt 使用libcmt.lib建立多執行緒可執行檔案

/mtd 使用libcmtd.lib建立除錯多執行緒可執行檔案

/md 使用msvcrt.lib建立多執行緒dll

/mdd 使用msvcrtd.lib建立除錯多執行緒dll

說明:(1)靜態鏈結的單執行緒庫

靜態鏈結的單執行緒庫只能用於單執行緒的應用程式,c執行時庫的目標**最終被編譯在應用程式的二進位制檔案中。

通過/ml編譯選項可以設定visual c++使用靜態鏈結的單執行緒庫。

(2)靜態鏈結的多執行緒庫

靜態鏈結的多執行緒庫的目標**也最終被編譯在應用程式的二進位制檔案中,但是它可以在多執行緒程式中使用。

通過/mt編譯選項可以設定visual c++使用靜態鏈結的多執行緒庫。

(3)動態鏈結的執行時庫

動態鏈結的執行時庫將所有的c庫函式儲存在乙個單獨的動態鏈結庫msvcrtxx.dll中,msvcrtxx.dll處理了多執行緒問題。

使用/md編譯選項可以設定visual c++使用動態鏈結的執行時庫。

/mld、/mtd或/mdd選項使用debug runtime library(除錯版本的執行時刻函式庫),與/ml、/mt或/md分別對應。debug版本的runtime library包含了除錯資訊,並採用了一些保護機制以幫助發現錯誤,加強了對錯誤的檢測,因此在執行效能方面比不上release版本。

程式執行時,很大一部分時間是在這些執行庫裡執行。在程式(release版)被編譯時,vc會根據編譯選項(單執行緒、多執行緒或dll)自動將相應的執行時庫檔案(libc.lib、libcmt.lib或import library msvcrt.lib)鏈結進來。

注:修改編譯選項,將/md或/mdd改為/mt或/mtd,就實現了對vc執行時庫的靜態鏈結,在執行時就不再需要vc的dll了。

五、附:

下面是msdn關於visual c++編譯器選項的說明:

這些選項選擇單執行緒或多執行緒執行時例程,指示多執行緒模組是否為dll,並選擇執行時庫的發布版本或除錯版本。

/md使應用程式使用執行時庫的多執行緒並特定於dll的版本。定義_mt和_dll,並使編譯器將庫名msvcrt.lib放入.obj檔案中。

用此選項編譯的應用程式靜態鏈結到msvcrt.lib。該庫提供允許鏈結器解析外部引用的**層。實際工作**包含在msvcr80.dll中,該庫必須在執行時對於與msvcrt.lib鏈結的應用程式可用。

當在定義了_static_cpplib(/d_static_cpplib)的情況下使用/md時,它將導致應用程式與靜態多執行緒標準c++庫(libcpmt.lib)而非動態版本(msvcprt.lib)鏈結,同時仍通過msvcrt.lib動態鏈結到主crt。

/mdd

定義_debug、_mt和_dll,並使應用程式使用執行時庫的除錯多執行緒並特定於dll的版本。它還使編譯器將庫名msvcrtd.lib放入.obj檔案中。

/ml使編譯器將庫名libc.lib放入.obj檔案中,以便鏈結器使用libc.lib解析外部符號。這是編譯器的預設操作。libc.lib不提供多執行緒支援。

/mld

定義_debug並使編譯器將庫名libcd.lib放入.obj檔案中,以便鏈結器使用libcd.lib解析外部符號。libcd.lib不提供多執行緒支援。

/mt使應用程式使用執行時庫的多執行緒靜態版本。定義_mt並使編譯器將庫名libcmt.lib放入.obj檔案中,以便鏈結器使用libcmt.lib解析外部符號。

/mtd

定義_debug和_mt。此選項還使編譯器將庫名libcmtd.lib放入.obj檔案中,以便鏈結器使用libcmtd.lib解析外部符號。

/ld建立 dll。

將/dll選項傳遞到鏈結器。鏈結器查詢dllmain函式,但並不需要該函式。如果沒有編寫 dllmain函式,鏈結器將插入返回true的dllmain函式。

鏈結dll啟動**。

如果命令列上未指定匯出(.exp)檔案,則建立導入庫(.lib);將導入庫鏈結到呼叫您的dll的應用程式。

將/fe(命名exe檔案)解釋為命名dll而不是.exe檔案;預設程式名成為basename.dll而不是basename.exe。

除非顯式指定/md,否則將暗指/mt。

/ldd

建立除錯dll。定義_mt和_debug。

警告不要混合使用執行時庫的靜態版本和動態版本。在乙個程序中有多個執行時庫副本會導致問題,因為副本中的靜態資料不與其他副本共享。鏈結器禁止在.exe檔案內部既使用靜態版本又使用動態版本鏈結,但您仍可以使用執行時庫的兩個(或更多)副本。例如,當與用動態(dll)版本的執行時庫鏈結的.exe檔案一起使用時,用靜態(非dll)版本的執行時庫鏈結的動態鏈結庫可能導致問題。(還應該避免在乙個程序中混合使用這些庫的除錯版本和非除錯版本)。

注:/ml、/mld貌似已經不提供;另,libc.lib,libcmt.lib和msvcrt.lib有對應的

ML MD 等編譯選項區別

三 功能 執行時庫是程式在執行時所需要的庫檔案,通常以lib或dll形式提供 c執行時庫 庫檔案 single thread static link libc.lib debug single thread static link libcd.lib multithread static link ...

MD d MT d 編譯選項的區別

以vs2005為例,這樣子開啟 1 開啟專案的property pages對話方塊 2 點選左側c c 節 3 點選code generation節 4 右側第六行runtime library專案 編譯選項 包含靜態鏈結的lib 說明 md mt dll msvcrt.lib 多執行緒 relea...

VC編譯選項

vc編譯選項 od 禁用優化 預設值 disable optimizations default ox 最大化選項。ogityb2 gs maximum opts.ogityb1 gs og 啟用全域性優化 enable global optimization oy 啟用框架指標省略 enable ...