VC編譯選項
- 多線程(/MT)
- 多線程調(diào)試 (/MTd)
- 多線程DLL (/MD)
- 多線程調(diào)試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 msvcrt.lib
- Debug multiThread(dynamic link) MDd msvcrtd.lib
各種 C 運行時庫的區(qū)分
靜態(tài)鏈接的單線程庫
靜態(tài)鏈接的單線程庫只能用于單線程的利用程序, C 運行時庫的目標代碼終究被編譯在利用程序的2進制文件中。通過 /ML 編譯選項可以設(shè)置 Visual C++ 使用靜態(tài)鏈接的單線
程庫。
靜態(tài)鏈接的多線程庫
靜態(tài)鏈接的多線程庫的目標代碼也終究被編譯在利用程序的2進制文件中,但是它可以在多線程程序中使用。通過 /MT 編譯選項可以設(shè)置 Visual C++ 使用靜態(tài)鏈接的多線程庫。
/MDd 、 /MLd 或 /MTd 選項使用 Debug runtime library( 調(diào)試版本的運行時刻函數(shù)庫 ) ,與 /MD 、 /ML 或 /MT 分別對應(yīng)。 Debug 版本的 Runtime Library 包括了調(diào)試信息,并采取了1些保護機制以幫助發(fā)現(xiàn)毛病,加強了對毛病的檢測,因此在運行性能方面比不上 Release 版本。
下面是msdn關(guān)于Visual C++ 編譯器選項的說明:這些選項選擇單線程或多線程運行時例程,唆使多線程模塊是不是為 DLL,并選擇運行時庫的發(fā)布版本或調(diào)試版本。
/MD 定義_MT 和 _DLL 以便同時從標準 .h 文件當選擇運行時例程的多線程特定版本和 DLL 特定版本。此選項還使編譯器將庫名MSVCRT.lib放入.obj文件中。用此選項編譯的利用程序靜態(tài)鏈接到MSVCRT.lib。該庫提供允許鏈接器解析外部援用的代碼層。實際工作代碼包括在 MSVCR71.DLL 中,該庫必須在運行時對與 MSVCRT.lib 鏈接的利用程序可用。
當在定義了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情況下使用 /MD 時,它將致使利用程序通過靜態(tài)多線程標準 C++ 庫 (libcpmt.lib) 而非動態(tài)版本 (msvcprt.lib) 進行鏈接,同時仍通過 msvcrt.lib 動態(tài)鏈接到主 CRT。
/MDd 定義 _DEBUG、_MT 和 _DLL,以便從標準 .h 文件當選擇運行時例程的調(diào)試多線程特定版本和 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 解析外部符號。創(chuàng)建多線程程序需要 /MT 或 /MD(或它們的調(diào)試等效選項 /MTd 或 /MDd)。
/MTd 定義 _DEBUG 和 _MT。定義 _MT 會致使從標準 .h 文件當選擇運行時例程的多線程特定版本。此選項還使編譯器將庫名 LIBCMTD.lib 放入 .obj 文件中,以便鏈接器使用 LIBCMTD.lib 解析外部符號。創(chuàng) 建多線程程序需要 /MTd 或 /MDd(或它們的非調(diào)試等效選項 /MT 或 MD)。
/LD 創(chuàng)建 DLL
將 /DLL 選項傳遞到鏈接器。鏈接器查找 DllMain 函數(shù),但其實不需要該函數(shù)。如果沒有編寫 DllMain 函數(shù),鏈接器將插入返回 TRUE 的 DllMain 函數(shù)。
鏈接 DLL 啟動代碼
如果命令行上未指定導(dǎo)出 (.exp) 文件,則創(chuàng)建導(dǎo)入庫 (.lib);將導(dǎo)入庫鏈接到調(diào)用您的 DLL 的利用程序。將 /Fe 解釋為命名 DLL 而不是 .exe 文件;默許程序名成為基名稱.dll 而不是基名稱.exe。如果還未顯式指定 /M 選項之1,則將默許運行時庫支持更改成 /MT。
/LDd 創(chuàng)建調(diào)試 DLL,定義 _DEBUG
正告 不要混合使用運行時庫的靜態(tài)版本和動態(tài)版本。在1個進程中有多個運行時庫副本會致使問題,由于副本中的靜態(tài)數(shù)據(jù)不與其他副本同享。鏈接器制止在 .exe 文件內(nèi)部既使用靜態(tài)版本又使用動態(tài)版本鏈接,但您仍可使用運行時庫的兩個(或更多)副本。例如,當與用動態(tài) (DLL) 版本的運行時庫鏈接的 .exe 文件1起使用時,用靜態(tài)(非 DLL)版本的運行時庫鏈接的動態(tài)鏈接庫可能致使問題。(還應(yīng)當避免在1個進程中混合使用這些庫的調(diào)試版本和非調(diào)試版本)。