C執行時庫

2021-08-21 23:43:25 字數 4924 閱讀 7315

visual studio文件的新主頁是docs.microsoft.com上的visual studio 2017文件。

可以在crt library features中找到該主題的最新版本。

本主題討論構成c執行時庫的各種.lib檔案及其關聯的編譯器選項和預處理程式指令。

c執行時庫(crt)

c執行時庫(crt)是包含iso c99標準庫的c ++標準庫的一部分。實現crt的visual c ++庫支援本機**開發,支援混合本機**和託管**,以及用於.net開發的純託管**。所有版本的crt都支援多執行緒開發。大多數庫既支援靜態鏈結,也支援將庫直接鏈結到**中,或支援動態鏈結以使**使用常見的dll檔案。

在visual studio 2015中,crt已經重構為新的二進位制檔案。universal crt(ucrt)包含標準c99 crt庫匯出的函式和全域性變數。ucrt現在是windows元件,並作為windows 10的一部分提供。現在可以在windows 10 sdk中找到ucrt的靜態庫,dll導入庫和標頭檔案。安裝visual c ++時,visual studio安裝程式會安裝使用ucrt所需的windows 10 sdk子集。您可以在visual studio 2015支援的任何windows版本上使用ucrt。您可以使用vcredist為windows 10以外的受支援windows版本重新分發它。有關詳細資訊,請參閱重新分發visual c ++檔案。

下表列出了實現ucrt的庫。

圖書館相關的dll

特點擊項

預處理程式指令

libucrt.lib

沒有將ucrt靜態鏈結到您的**中。

/公噸

_公噸libucrtd.lib

沒有用於靜態鏈結的ucrt的除錯版本。不可再發行。

/ mtd

_debug,_mt

ucrt.lib

ucrtbase.dll

用於ucrt的dll導入庫。

/ md

_mt,_dll

ucrtd.lib

ucrtbased.dll

用於ucrt的debug版本的dll導入庫。不可再發行。

/ mdd

_debug,_mt,_dll

vcruntime庫包含visual c ++ crt特定於實現的**,例如異常處理和除錯支援,執行時檢查和型別資訊,實現細節和某些擴充套件庫函式。該庫特定於所用編譯器的版本。

此表列出了實現vcruntime庫的庫。

圖書館相關的dll

特點擊項

預處理程式指令

libvcruntime.lib

沒有靜態鏈結到您的**中。

/公噸

_公噸libvcruntimed.lib

沒有用於靜態鏈結的除錯版本。不可再發行。

/ mtd

_mt,_debug

vcruntime.lib

vcruntime 《版本》的.dll

用於vcruntime的dll導入庫。

/ md

_mt,_dll

vcruntimed.lib

vcruntime 《版本》 d.dll

debug vcruntime的dll導入庫。不可再發行。

/ mdd

_debug,_mt,_dll

根據crt庫是靜態鏈結還是動態鏈結,還是本機,託管或混合**,初始化crt的**位於多個庫之一。此**處理crt啟動,內部每執行緒資料初始化和終止。它特定於所用編譯器的版本。即使使用動態鏈結的ucrt,此庫也始終靜態鏈結。

此表列出了實現crt初始化和終止的庫。

圖書館特點

選項預處理程式指令

libcmt.lib

將本機crt啟動靜態鏈結到您的**中。

/公噸

_公噸libcmtd.lib

靜態鏈結本機crt啟動的除錯版本。不可再發行。

/ mtd

_debug,_mt

msvcrt.lib

用於本機crt啟動的靜態庫,用於dll ucrt和vcruntime。

/ md

_mt,_dll

msvcrtd.lib

用於dll ucrt和vcruntime的本機crt啟動的debug版本的靜態庫。不可再發行。

/ mdd

_debug,_mt,_dll

msvcmrt.lib

用於混合本機和託管crt啟動的靜態庫,用於dll ucrt和vcruntime。

/ clr

msvcmrtd.lib

用於dll ucrt和vcruntime的混合本機和託管crt啟動的debug版本的靜態庫。不可再發行。

/ clr

msvcurt.lib

純託管crt的靜態庫。

/ clr:純

msvcurtd.lib

用於純託管crt的debug版本的靜態庫。不可再發行。

/ clr:純

如果從命令列鏈結程式而沒有指定c執行時庫的編譯器選項,則鏈結器將使用靜態鏈結的crt庫:libcmt.lib,libvcruntime.lib和libucrt.lib。

使用靜態鏈結的crt意味著c執行時庫儲存的任何狀態資訊都將是crt例項的本地資訊。例如,如果在使用靜態鏈結的crt時使用strtok,_strtok_l,wcstok,_wcstok_l,_mbstok,_mbstok_l,則strtok解析器的位置strtok與同一程序中的**中使用的狀態無關(但在不同的dll或exe中)它鏈結到靜態crt的另乙個例項。相反,動態鏈結的crt為動態鏈結到crt的程序內的所有**共享狀態。如果您使用這些功能的新的更安全版本,則此問題不適用; 例如,strtok_s沒有這個問題。

因為通過鏈結到靜態crt構建的dll將具有其自己的crt狀態,所以不建議靜態鏈結到dll中的crt,除非特別期望和理解其後果。例如,如果在載入鏈結到其自己的靜態crt的dll的可執行檔案中呼叫_set_se_translator,則dll中的**生成的任何硬體異常都不會被轉換程式捕獲,但主可執行檔案中的**生成的硬體異常將被抓住了

如果使用/ clr編譯器開關,則**將與靜態庫msvcmrt.lib鏈結。靜態庫在託管**和本機crt之間提供**。您不能將靜態鏈結的crt(/ mt/ mtd選項)與/ clr一起使用。請改用動態鏈結庫(/ md/ mdd)。

如果您使用的是/ clr:pure編譯器開關,則您的**將與靜態庫msvcurt.lib鏈結。與/ clr一樣,您無法鏈結靜態鏈結庫。

有關將crt與/ clr一起使用的更多資訊,請參閱混合(本機和託管)程式集 ; for/ clr:pure,請參閱pure and verifiable code(c ++ / cli)。

要構建應用程式的除錯版本,必須定義_debug標誌,並且應用程式必須與其中乙個庫的除錯版本鏈結。有關使用庫檔案的除錯版本的更多資訊,請參閱crt除錯技術。

此版本的crt不完全符合c99標準。特別是,不支援頭和cx_limited_range / fp_contract pragma巨集。某些元素(例如標準io函式中引數說明符的含義)預設使用傳統解釋。您可以使用/ zc編譯器一致性選項並指定鏈結器選項來控制庫一致性的某些方面,

標準c ++庫

標準c ++庫

特點擊項

預處理程式指令

libcpmt.lib

多執行緒,靜態鏈結

/公噸

_公噸msvcprt.lib

多執行緒,動態鏈結(msvcp .dll的導入庫)

/ md

_mt,_dll

libcpmtd.lib

多執行緒,靜態鏈結

/ mtd

_debug,_mt

msvcprtd.lib

多執行緒,動態鏈結(msvcp 《版本》 d.dll的導入庫)

/ mdd

_debug,_mt,_dll

當您構建專案的發布版本時,預設情況下鏈結其中乙個基本c執行時庫(libcmt.lib,msvcmrt.lib,msvcrt.lib),具體取決於您選擇的編譯器選項(多執行緒,dll,/ clr)。如果在**中包含乙個標頭檔案參考,則標準c ++庫將在編譯時由visual c ++自動鏈結。例如:

#include 

如果應用程式使用多個crt版本會出現什麼問題?

如果您有多個dll或exe,那麼您可能有多個crt,無論您是否使用不同版本的visual c ++。例如,將crt靜態鏈結到多個dll可能會出現同樣的問題。使用靜態crt遇到此問題的開發人員已被指示使用/ md進行編譯以使用crt dll。如果您的dll通過dll邊界傳遞crt資源,您可能會遇到crt不匹配的問題,需要使用visual c ++重新編譯專案。

如果您的程式使用多個版本的crt,則在跨越dll邊界傳遞某些crt物件(例如檔案控制代碼,語言環境和環境變數)時需要注意。有關所涉及的問題以及如何解決它們的更多資訊,請參閱跨dll邊界傳遞crt物件的潛在錯誤。

C執行時庫

1.概論 執行時庫是 程式在執行時所需要的庫檔案,通常執行時庫是以 lib或 dll形式提供的。c執行時庫誕生於 20世紀 70年代,當時的程式世界還很單純,應用程式都是單執行緒的,多工或多執行緒機制在此時還屬於新觀念。所以這個 j時期的 c執行時庫都是單執行緒的。隨著 作業系統 多執行緒技術的發展...

VC執行時庫

vc專案屬性 配置屬性 c c 生成 執行時庫 可以採用的方式有 多執行緒 mt 多執行緒除錯 mtd 多執行緒dll md 多執行緒除錯dll mdd 單執行緒 ml 單執行緒除錯 mld reusable library switch library macro s defined single...

VC執行時庫

vc專案屬性 配置屬性 c c 生成 執行時庫 可以採用的方式有 多執行緒 mt 多執行緒除錯 mtd 多執行緒dll md 多執行緒除錯dll mdd 單執行緒 ml 單執行緒除錯 mld reusable library switch library macro s defined single...