共用方式為


將程式碼升級至通用 CRT

Microsoft C 執行時間程式庫 (CRT) 已在 Visual Studio 2015 中重構。 標準 C 程式庫、POSIX 延伸模組以及 Microsoft 特定函式、巨集和全域變數都已移至新的程式庫:通用 C 執行階段程式庫 (通用 CRT 或 UCRT)。 CRT 的編譯器特有元件已移至新的 vcruntime 程式庫。

UCRT 現在是 Windows 元件,隨附于 Windows 10 和更新版本。 UCRT 根據 C 呼叫慣例來支援穩定 ABI,並且緊密符合 ISO C99 標準,而且只有幾個例外狀況。 它不再系結至特定版本的編譯器。 您可以在 Visual Studio 2015 或 Visual Studio 2017 支援的任何 Windows 版本上使用 UCRT。 優點是每次升級 Visual Studio 時,您不再需要更新組建以將目標設為 CRT 的新版本。

此重構已變更許多 CRT 標頭檔、程式庫檔案和可轉散發檔案的名稱或位置,以及程式碼所需的部署方法。 UCRT 中的許多函式和宏也已新增或變更,以改善標準一致性。 若要利用這些變更,您必須更新現有的程式碼和專案建置系統。

找到通用 CRT 檔案的位置

作為 Windows 元件,UCRT 程式庫檔案和標頭現在是 Windows 軟體開發套件 (SDK) 的一部分。 當您安裝 Visual Studio 時,也會安裝使用 UCRT 所需的一部分 Windows SDK。 Visual Studio 安裝程式會將 UCRT 標頭、程式庫和 DLL 檔案的位置新增至 Visual Studio 專案建置系統所使用的預設路徑。 當您更新 Visual Studio C++ 專案時,如果使用預設專案設定,IDE 會自動尋找標頭檔的新位置。 而且,連結器會自動使用新的預設 UCRT 和 vcruntime 程式庫。 同樣地,如果您使用開發人員命令提示字元執行命令列建置,則會更新包含標頭和程式庫路徑的環境變數,同時自動運作。

標準 C 程式庫標頭檔現在位於 Windows SDK 之 include 資料夾的 SDK 版本特定目錄中。 標頭檔的典型位置位於 下的 Windows Kits\10\Include\[sdk-version]\ucrt Program Files 或 Program Files (x86) 目錄中,其中 [sdk-version] 會對應至 Windows 版本或更新,例如 Windows 10.0.14393.0。

UCRT 靜態程式庫和動態連結存根程式庫位於 下的 Program Files 或 Program Files (x86) 目錄中,其中 architecture 是 ARM64、x86 或 X64 Windows Kits\10\Lib\[sdk-version]\ucrt\[architecture] 。 零售和偵錯靜態程式庫為 libucrt.liblibucrtd.lib ,而 UCRT DLL 的程式庫為 ucrt.libucrtd.lib

零售和偵錯 UCRT DLL 位於不同的位置中。 零售 DLL 是可轉散發的檔案,可以在 下的 Program Files 或 Program Files (x86) 目錄中 Windows Kits\10\Redist\ucrt\DLLs\[architecture]\ 找到 。 偵錯 UCRT 程式庫不是可轉散發檔案,而且可以在資料夾下的 Windows Kits\10\bin\[architecture]\ucrt Program Files 或 Program Files (x86) 目錄中找到

哪裡可以找到標準程式庫和標頭

C 和 C++ 編譯器特定的執行時間支援程式庫 vcruntime 包含支援程式啟動和例外狀況處理和內建等功能所需的程式碼。 您的 Program Files 或 Program files (x86) 目錄中的版本特定 Microsoft Visual Studio 資料夾中 仍可找到程式庫及其標頭檔。

在 Visual Studio 2017、2019 和 2022 中,標頭檔位於 下方 Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\include[year]以下是 Visual Studio 的版本, [edition] 是 Visual Studio 的版本或昵稱,而 [lib-version] 是程式庫的組建版本。

程式庫位於 底下 Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\lib\[architecture] ,其中 [year] 是 Visual Studio 的版本, [edition] 是 Visual Studio 的版本或昵稱, [lib-version] 是程式庫的組建版本,而且 [architecture] 是目標處理器架構。 OneCore 和 Store 的連結程式庫也可以位於 libraries 資料夾中。

靜態程式庫的零售和偵錯版本為 libvcruntime.liblibvcruntimed.lib 。 動態連結零售和偵錯存根庫分別是 vcruntime.libvcruntimed.lib

當您更新 Visual Studio C++ 專案時,如果您已將專案的 Linker 屬性 [忽略所有預設程式庫 ] 設定為 [是 ],或者如果您使用 /NODEFAULTLIB 命令列上的連結器 選項,則必須更新程式庫清單以包含新的重構程式庫。 以對等重構的程式庫取代舊的 CRT 程式庫,例如 、 libcmt.liblibcmtd.libmsvcrt.libmsvcrtd.lib 。 如需要使用的特定程式庫資訊,請參閱 CRT 程式庫功能

通用 CRT 的部署和轉散發

因為 UCRT 現在是 Microsoft Windows 作業系統元件,所以它包含在 Windows 10 和更新版本中的作業系統中。 它可透過 Windows Update 取得舊版作業系統 Windows Vista 到 Windows 8.1。 可轉散發版本適用于 Windows XP。 作為作業系統元件,不管 Visual Studio 和 Microsoft C++ 編譯器版本為何,Windows Update 都會管理 UCRT 更新和服務。 由於 UCRT 是 Windows 元件,因此為了安全性與輕鬆更新,以及較小的映射大小,強烈建議您使用可轉散發套件來針對您的應用程式執行 UCRT 的集中部署。

您可以在 Visual Studio 2015 或更新版本所支援的任何 Windows 版本上使用 UCRT。 您可以在 Windows 10 之前,使用 vcredist Windows 10 支援版本的套件來轉散發它。 這些 vcredist 套件包含 UCRT 元件,並自動將它們安裝在預設未安裝它們的 Windows 作業系統上。 如需詳細資訊,請參閱轉散發 Visual C++ 檔案

支援 UCRT 的應用程式本機部署,但基於效能和安全性原因不建議使用。 UCRT 應用程式本機部署的 DLL 包含在 Windows SDK redist 的子目錄中。 所需的 DLL 包含 ucrtbase.dll 和一組名為 api-ms-win-[subset].dll APISet 轉寄站 DLL。 每個作業系統上所需的這組 DLL 都會不同,因此建議您在使用應用程式本機部署時包括所有 DLL。 如需應用程式本機部署的詳細資訊和建議,請參閱 Visual C++ 中的部署。

通用 CRT 函式和巨集的變更

已在 UCRT 中新增或更新許多函式,可改善 ISO C99 一致性,以及解決程式碼品質和安全性問題。 在某些情況下,這需要程式庫的重大變更。 當您使用舊版 CRT 時,已完全編譯的程式碼可能會在您使用 UCRT 編譯時中斷。 若是如此,您必須變更程式碼,以利用 UCRT 更新和功能。 如需通用 CRT 中找到之 CRT 的詳細重大變更和更新清單,請參閱 Visual C++ 變更歷程記錄的 C 執行階段程式庫 (CRT) 區段。 它包括受影響標頭和函式的清單,可用來識別您程式碼中所需的變更。

另請參閱

Visual C++ 移植和升級指南
潛在升級問題概觀 (Visual C++)
從舊版 Visual C++ 升級專案
Visual C++ 變更歷程記錄 2003 - 2015
Visual Studio 中的 C++ 一致性改善