共用方式為


CRT 程式庫功能

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

C 執行階段程式庫 (CRT)

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

(不含 iostream 或標準的 C++ 程式庫) 的 c 執行階段程式庫

相關聯的 DLL

特性

選項

前置處理器指示詞

libcmt.lib

無、 靜態連結。

多執行緒的靜態連結

/MT

_MT

msvcrt.lib

msvcr110.dll

多執行緒的動態連結 (如 MSVCR110 的匯入程式庫。DLL)。 請注意如果您使用標準的 C++ 程式庫時,您的程式必須 MSVCP110。若要執行的 DLL。

/MD

_MT _DLL

libcmtd.lib

無,靜態連結

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

/MTd

_DEBUG _MT

msvcrtd.lib

msvcr110d.dll

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

/MDd

_DEBUG,_MT _DLL

msvcmrt.lib

無,靜態連結

C 執行階段靜態程式庫。 用於混合的管理/原生程式碼。

/clr

/clr:oldSyntax

 

msvcurt.lib

無,靜態連結

編譯為 100%純 MSIL 程式碼 c 執行階段靜態程式庫。 所有的程式碼符合 ECMA URT 規格的 MSIL。

/clr:pure

 

注意事項注意事項

單一執行緒 CRT (libc.lib,libcd.lib) (先前/ML/MLd選項) 便不會出現。相反地,使用多執行緒的 CRT。請參閱 多執行緒程式庫的效能

如果您要連結您的程式,從命令列不會指定 c 的執行階段程式庫編譯器選項的情況下,連結器會使用 LIBCMT。LIB。 這是從舊版 Visual C++ 用 LIBC 不同。LIB、 單一執行緒的程式庫,而是。

使用以靜態方式連結的 CRT,表示 c 執行階段程式庫所儲存的任何狀態資訊是由該執行個體的 CRT。 比方說,如果您使用strtok、 _strtok_l、 wcstok、 _wcstok_l、 _mbstok、 _mbstok_l時使用的位置以靜態方式連結的 CRT strtok不到相關的剖析器strtok程式碼中使用相同的程序在 (但在不同的 DLL 或 EXE) 連結到另一個執行個體的 CRT 靜態狀態。 相反地,以動態方式連結的 CRT 共用動態連結至 CRT 在處理序中的所有程式碼的狀態。 有關這方面不適用,如果您使用這些函式 ; 更安全的新版本 例如, strtok_s並不會發生這個問題。

因為建置藉由連結至靜態的 CRT DLL 會有自己的 CRT 狀態,所以不建議除非特別想要和了解的結果以靜態方式連結至 CRT DLL 中。 比方說,如果您呼叫 _set_se_translator 中的可執行檔載入 DLL 連結至其本身的靜態 CRT,不會攔截在 DLL 中的程式碼所產生的任何硬體例外狀況的轉譯程式,但會抓到主要的可執行檔中的程式碼所產生的硬體例外狀況。

如果您使用**/clr編譯器參數,您的程式碼將會連結與靜態程式庫、 msvcmrt.lib。 靜態程式庫提供的 managed 程式碼與原生的 CRT 之間的 proxy。 您不能使用以靜態方式連結的 CRT ( /MT/MTd選項) 與/clr**。 使用動態連結程式庫 (/MD或**/MDd**) 相反。

如果您使用**/clr:pure編譯器參數,您的程式碼將會連結與靜態程式庫 msvcurt.lib。 如同/clr**,您不能連結與靜態連結程式庫。

如需有關使用了 CRT 與**/clr**,請參閱混合 (原生和 Managed) 組件。 for /clr:pure, see 純粹的和可驗證的程式碼 (C++/CLI).

若要建置您的應用程式的偵錯版本 _DEBUG 旗標必須定義與應用程式一定要連線的其中一個程式庫的偵錯版本。 如需有關如何使用程式庫檔案的偵錯版本的詳細資訊,請參閱 CRT 偵錯技巧

這一版的Visual C++會和 C99 標準。

Standard C++ 程式庫

Standard C++ 程式庫

特性

選項

前置處理器指示詞

LIBCPMT。LIB

多執行緒的靜態連結

/MT

_MT

MSVCPRT。LIB

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

/MD

_MT _DLL

LIBCPMTD。LIB

多執行緒的靜態連結

/MTd

_DEBUG _MT

MSVCPRTD。LIB

多執行緒的動態連結 (如 MSVCP110D 的匯入程式庫。DLL)

/MDd

_DEBUG,_MT _DLL

附註 LIBCP。LIB 和 LIBCPD。LIB (透過舊**/ML/MLd選項) 已被移除。 使用 LIBCPMT。LIB 和 LIBCPMTD。LIB 而是透過/MT/MTd**選項。

當您建置發行版本的專案,其中一項基本 c 執行階段程式庫 (LIBCMT。LIB 為 MSVCMRT。LIB 為 MSVCRT。根據預設值連結 LIB)、 編譯器選項視您選擇 (多執行緒作業,DLL,/clr)。 如果您希望將其中一個標頭檔在程式碼中,標準的 C++ 程式庫將會連結在 [自動地Visual C++在編譯時期。 例如:

#include <ios> 

Msvcrt.dll 和 msvcr110.dll 之間的差異為何?

Msvcrt.dll,現在是 「 已知的 DLL,"也就是說,它一個系統元件所擁有,並且由 Windows 所建置。 它可能是供日後使用僅供系統層級的元件。

如果應用程式同時使用了 msvcrt.dll 和 msvcr110.dll,就會發生何種問題?

如果您要連結至 msvcrt.lib.lib 或.obj 檔案,然後您應該不需要重新編譯來使用 Visual C++ 中新的 msvcrt.lib。 .Lib 或.obj 檔案可能會仰賴大小、 欄位的位移或成員函式名稱的各種 CRT 類別或變數,以及那些應該所有仍存在相容的方式。 當您重新連結對 msvcrt.lib 時,您最後的 EXE 和 DLL 映像將現在對 msvcr110.dll,而非 msvcrt.dll 相依性。

如果您有一個以上 DLL 或 EXE,那麼無論您使用不同版本,您可能有一個以上的 CRT, Visual C++。 比方說,靜態連結至多個 Dll 的 CRT,可呈現相同的問題。 發生此問題的靜態 CRTs 的開發人員已經指示要編譯的**/MD**使用 CRT DLL。 既然 CRT DLL 已重新命名為 msvcr110.dll,應用程式可能會有 msvcrt.dll,和其他人在連結到 msvcr110.dll 的某些元件。 如果您的 Dll CRT 資源跨 msvcrt.dll,msvcr110.dll 界限傳遞,您將會遇到問題的不相符的 CRTs,並需要重新編譯於 Visual C++ 專案。

如果您的程式正在使用多個版本的 CRT,點兒時需要傳遞特定的 CRT 物件 (例如檔案控制代碼、 地區設定和環境變數) 跨越 DLL 界限。 如需更多有關涉及的問題,以及如何解決這種問題,請參閱跨越 DLL 界限傳遞 CRT 物件可能發生的錯誤

請參閱

其他資源

C 執行階段程式庫參考