多執行緒除錯 DLL MDd

2021-07-02 14:08:19 字數 2852 閱讀 3916

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

多執行緒除錯)

軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。cpp view plain copy include intvalue 0 void test intmain 1 資料斷點 所謂資...

linux gdb 除錯多執行緒 單獨除錯執行緒

linux gdb 除錯多執行緒 單獨除錯執行緒 2011年01月26日 星期三 下午 06 10 一 多執行緒除錯 多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令 info thread 檢視當前程序的執行緒。thread 切換除錯的執行緒為指定id的執行緒。break file.c 1...

多執行緒程式設計 多執行緒gdb除錯

學習多執行緒程式設計怎麼能夠不會多執行緒 gdb 除錯呢?這一講主要學習多執行緒的 gdb 除錯。首先列出我們經常會使用到的指令 1 info threads 顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的線 程。2 t...