CRT 程式庫功能
本主題討論構成 c 執行階段程式庫,以及其相關聯的編譯器選項和前置處理器指示詞的各種.lib 檔案。
C 執行階段程式庫 (CRT)
下列程式庫包含的 c 執行階段程式庫函式。
(不含 iostream 或標準的 C++ 程式庫) 的 c 執行階段程式庫 |
相關聯的 DLL |
特性 |
選項 |
前置處理器指示詞 |
---|---|---|---|---|
libcmt.lib |
無、 靜態連結。 |
多執行緒的靜態連結 |
_MT |
|
msvcrt.lib |
msvcr110.dll |
多執行緒的動態連結 (如 MSVCR110 的匯入程式庫。DLL)。請注意如果您使用標準的 C++ 程式庫時,您的程式必須 MSVCP110。若要執行的 DLL。 |
_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 物件可能發生的錯誤。