共用方式為


CRT 程式庫功能

本主題討論組成 C 執行階段的各種 .lib 檔案,以及其相關聯的編譯器選項與前置處理器指示詞。

C 執行階段程式庫 (CRT)

下列程式庫包含 C 執行階段程式庫函式。

C 執行階段程式庫 (不含 iostream 或 standard C++ 程式庫)

相關聯的 DLL

特性

選項

前置處理器指示詞

libcmt.lib

無、靜態連結。

多執行緒、靜態連結

/MT

_MT

msvcrt.lib

msvcr120.dll

多執行緒、動態連結 (如 MSVCR120.DLL 的匯入程式庫)。 請注意,如果是使用 Standard C++ 程式庫,您的程式必須有 MSVCP120.DLL 才能執行。

/MD

_MT、_DLL

libcmtd.lib

無、靜態連結

多執行緒、靜態連結 (偵錯)

/MTd

_DEBUG、_MT

msvcrtd.lib

msvcr120d.dll

多執行緒、動態連結 (MSVCR120.DLL 的匯入程式庫) (偵錯)。

/MDd

_DEBUG、_MT、_DLL

msvcmrt.lib

無、靜態連結

C++ 執行階段靜態程式庫。 用於混合的 Managed/機器碼。

/clr

 

msvcurt.lib

無、靜態連結

編譯為 100% 純 MSIL 程式碼的 C 執行階段靜態程式庫。 所有程式碼皆遵守 MSIL 的 ECMA URT 規格。

/clr:pure

 

注意事項注意事項

單一執行緒 CRT (libc.lib、libcd.lib) (先前稱為 /ML/MLd 選項) 已無法再使用。取而代之的是多執行緒的 CRT。請參閱多執行緒程式庫效能

從命令列連結程式時如果未指定編譯器選項來指定 C 執行階段程式庫,連結器將會使用 LIBCMT.LIB。 這不同於舊版的 Visual c + + 會使用 LIBC.LIB,其會使用單一執行緒程式庫。

使用靜態連結的 CRT 表示 C 執行階段程式庫所儲存的任何狀態資訊,都會是 CRT 執行個體的本機資訊。 例如,如果您在使用靜態連結的 CRT 時使用 strtok、_strtok_l、wcstok、_wcstok_l、_mbstok、_mbstok_lstrtok 剖析器的位置與連結到其他靜態 CRT 執行個體之同一處理序 (但位於不同的 DLL 或 EXE) 中使用的 strtok 無關。 反之,動態連結的 CRT 在動態連結到該 CRT 之處理序中,會共用所有程式碼的狀態。 如果您使用更安全的新函式版本,就無須考慮此問題。例如 strtok_s 就沒有此問題。

因為藉由連結到靜態 CRT 所建置的 DLL,會具備 CRT 狀態,因此除非您已確實了解此結果並有此需要,否則不建議在 DLL 中以靜態方式連結到 CRT。 例如,如果您在載入 DLL 連結到其自身靜態 CRT 之可執行檔中呼叫 _set_se_translator,轉譯器將攔截不到 DLL 程式碼所產生的任何硬體例外狀況,而只會攔截到主要可執行檔中之程式碼所產生的硬體例外狀況。

如果您使用 /clr 編譯器參數,您的程式碼將會連結到靜態程式庫 msvcurt.lib。 靜態程式庫會提供 Managed 程式碼與原生 CRT 之間的 Proxy。 請勿將靜態連結的 CRT ( /MT/MTd 選項) 與 /clr 並用。 請使用動態連結程式庫 (/MD 或改用 /MDd)。

如果您使用 /clr:pure 編譯器參數,您的程式碼將連結到靜態程式庫 msvcurt.lib。 一如 /clr,您無法連結到靜態連結的程式庫。

如需搭配使用 CRT 與 /clr 的詳細資訊,請參閱 混合 (原生和 Managed) 組件;對於 /clr:pure,請參閱純粹的和可驗證的程式碼 (C++/CLI)

若要建置應用程式的偵錯版本,必須定義 _DEBUG 旗標,且應用程式必須連結到任一程式庫的偵錯版本。 如需如何使用程式庫檔案之偵錯版本的詳細資訊,請參閱 CRT 偵錯技法

此版 Visual C++ 不符合 C99 標準。

Standard C++ 程式庫

Standard C++ 程式庫

特性

選項

前置處理器指示詞

LIBCPMT.LIB

多執行緒、靜態連結

/MT

_MT

MSVCPRT.LIB

多執行緒、動態連結 (MSVCP120.dll 的匯入程式庫)

/MD

_MT、_DLL

LIBCPMTD.LIB

多執行緒、靜態連結

/MTd

_DEBUG、_MT

MSVCPRTD.LIB

多執行緒、動態連結 (MSVCR120.DLL 的匯入程式庫)

/MDd

_DEBUG、_MT、_DLL

注意:LIBCP.LIB 及 LIBCPD.LIB (透過舊版的 /ML/MLd 選項) 已經移除。 請改用 LIBCPMT.LIB 及 LIBCPMTD.LIB,而不要透過 /MT/MTd 選項。

當您建置發行版本的專案時,預設會依據您選擇的編譯器選項 (多執行緒、DLL、/clr),連結到基本 C 執行階段程式庫 (LIBCMT.LIB、MSVCMRT.LIB、MSVCRT.LIB) 中的一個。 如果您在程式碼中其中一個 C++ 標準程式庫標頭檔,Standard c + + 程式庫將由 Visual C++ 於編譯時自動連入。 例如:

#include <ios> 

若要變更 Visual Studio 中所連結的基本 C 執行階段程式庫,請開啟專案的屬性頁。 開啟 [組態屬性]、[C/C++]、[程式碼產生]頁面,然後變更 [執行階段程式庫] 設定。 若要變更 Common Language Runtime 程式庫,請開啟專案的屬性頁。 開啟 [組態屬性]、[C/C++]、[一般]頁面上,然後變更 [Common Language RunTime 支援] 設定。

msvcrt.dll 與 msvcr120.dll 有何不同?

msvcrt.dll 現在是「已知的 DLL」,亦即此 DLL 已是 Windows 擁有及建置的系統元件。 其用途僅供系統層級元件於日後使用。

如果應用程式同時使用 msvcrt.dll 與 msvcr120.dll,將會發生什麼問題?

如果您有 lib 或.obj 檔案需要連結到 msvcrt.lib,您無須重新加以編譯,就能與 Visual C++ 中新的 msvcrt.lib 搭配運作。 .lib 或.obj 檔案仍可繼續使用大小、欄位位移,或各種 CRT 類別或變數的成員函式名稱,而且這些項目都會以相容的方式繼續存在。 當您針對 msvcrt.lib 重新連結時,您 EXE 及 DLL 的最終映像將會相依於 msvcr120.dll,而不是 msvcrt.dll。

無論您是否使用不同版本的Visual C++,只要您有多個 DLL 或 EXE,就可能會有多個 CRT。 例如,以靜態方式將 CRT 連結到多個 DLL 就可能會出現相同的問題。 已指示遇到此靜態 CRT 問題的開發人員使用 /MD 編譯,如此就能使用 CRT DLL。 現在,此 CRT DLL 已重新命名為 msvcr120.dll,但應用程式中可能有些會連結到 msvcrt.dll,有些會連結到 msvcr120.dll。 如果您的 DLL 跨 msvcrt.dll 與 msvcr120.dll 界限傳遞 CRT 資源,您將會出現 CRT 不相符的問題,而且必須使用 Visual C++ 重新編譯專案。

如果您的程式使用多種版本的 CRT,在跨 DLL 界限傳遞特定 CRT 物件 (例如檔案控制代碼、地區設定及環境變數) 時,必須特別留意。 如須相關問題及這些問題之解決方法的詳細資訊,請參閱 跨 DLL 界限傳遞 CRT 物件時可能發生的錯誤

請參閱

其他資源

C 執行階段程式庫參考