VC 關於除錯和多執行緒的編譯選項

2021-06-09 07:07:22 字數 2865 閱讀 2675

vc編譯選項 多執行緒(/mt)

多執行緒除錯(/mtd)

多執行緒 dll (/md)

多執行緒除錯 dll (/mdd)

c 執行時庫                        庫檔案

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 版本。 

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

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

選項     說明

/md     定義 _mt 和 _dll 以便同時從標準 .h 檔案中選擇執行時例程的多執行緒特定版本和 dll 特定版本。此選項還使編譯器將庫名 msvcrt.lib 放入 .obj 檔案中。

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

接的應用程式可用。

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

,同時仍通過 msvcrt.lib 動態鏈結到主 crt。

/mdd     定義 _debug、_mt 和 _dll,以便從標準 .h 檔案中選擇執行時例程的除錯多執行緒特定版本和 dll 特定版本。它還使編譯器將庫名 msvcrtd.lib 放入 .obj 檔案中。

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

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

/mt     定義 _mt,以便從標準頭 (.h) 檔案中選擇執行時例程的多執行緒特定版本。此選項還使編譯器將庫名 libcmt.lib 放入 .obj 檔案中,以便鏈結器使用 libcmt.lib 解析

外部符號。建立多執行緒程式需要 /mt     或 /md(或它們的除錯等效選項 /mtd 或 /mdd)。

/mtd     定義 _debug 和 _mt。定義 _mt 會導致從標準 .h 檔案中選擇執行時例程的多執行緒特定版本。此選項還使編譯器將庫名 libcmtd.lib 放入 .obj 檔案中,以便鏈結器使

用 libcmtd.lib 解析外部符號。創    建多執行緒程式需要 /mtd 或 /mdd(或它們的非除錯等效選項 /mt 或 md)。

/ld     建立 dll。

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

鏈結 dll 啟動**。

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

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

如果還未顯式指定 /m 選項之一,則將預設執行時庫支援更改為 /mt。

/ldd     建立除錯 dll。定義 _debug。

警告   不要混合使用執行時庫的靜態版本和動態版本。在乙個程序中有多個執行時庫副本會導致問題,因為副本中的靜態資料不與其他副本共享。鏈結器禁止在 .exe 檔案內

部既使用靜態版本又使用動態版本鏈結,但您仍可以使用執行時庫的兩個(或更多)副本。例如,當與用動態 (dll) 版本的執行時庫鏈結的 .exe 檔案一起使用時,用靜態(非 

dll)版本的執行時庫鏈結的動態鏈結庫可能導致問題。(還應該避免在乙個程序中混合使用這些庫的除錯版本和非除錯版本)。

**:

vc除錯多執行緒程式的方法

1 對一條特定的執行緒進行除錯 visual c 偵錯程式支援多線的情況,如果你在許多執行緒都呼叫的函式中 有個方法可以避開這個問題,就是掛起所有執行緒,除了你感興趣的那條 要除錯 的那條 在偵錯程式中開啟 debug 選單並選擇 thread 你就可以獲得乙個執行緒對 話框,在這裡你可以掛起所有的...

VC除錯版本與發布版本編譯鏈結選項差異和區別

1.鏈結庫 single threaded ml libc none static multithread mt libcmt mt dynamic link dll md msvcrt mt and dll debug single threaded mld libcd debug debug s...

與除錯有關的編譯和鏈結選項

跟蹤錯誤有用的編譯選項 w4 用最高的警告層次編譯 所有版本均使用 d debug 開啟條件編譯除錯開關,即定義了 debug 僅除錯版使用 gz檢查包括未被初始化的自動 區域性 變數 堆疊錯誤 不正確的函式原型 僅除錯版使用 od關閉優化開關,使得 更易讀懂 僅除錯版使用 gf消除重複的字串,並將...