在 Visual Studio 中使用 CMake 預設值設定和建置

CMake 支援兩個檔案,可讓使用者指定一般設定、建置和測試選項,並與其他人共用: CMakePresets.jsonCMakeUserPresets.json 。 使用這些檔案在 Visual Studio 和 Visual Studio Code 中驅動 CMake、在持續整合 (CI) 管線中,以及從命令列。

CMakePresets.json 用於儲存整個專案的組建。 CMakeUserPresets.json 是讓開發人員儲存自己的本機組建。 Visual Studio 2019 16.10 版或更新版本支援這兩個檔案。

本文包含與 Visual Studio 整合的相關資訊 CMakePresets.json 。 以下是實用的連結:

我們建議 CMakePresets.json 做為 的 CMakeSettings.json 替代方案。 Visual Studio 永遠不會同時從 CMakePresets.jsonCMakeSettings.json 讀取。 若要在 Visual Studio 中啟用或停用 CMakePresets.json 整合,請參閱 在 Visual Studio 2019 中啟用 CMakePresets.json

支援的 CMake 和 CMakePresets.json 版本

支援的 CMakePresets.jsonCMakeUserPresets.json 架構版本取決於您的 Visual Studio 版本:

  • Visual Studio 2019 16.10 版和更新版本支援架構版本 2 和 3。
  • Visual Studio 2022 17.4 版 Preview 1 新增架構第 4 版的支援。
  • Visual Studio 2022 17.5 版 Preview 1 新增架構第 5 版的支援。

您可以變更 "version" 根物件中的 欄位來更新版本。 如需範例和詳細資訊,請參閱 CMakePresets.json 格式

當您從命令列叫用 CMakePresets.json CMake 時,需要 CMake 3.20 版或更新版本。 不過,Visual Studio 會讀取和評估 CMakePresets.jsonCMakeUserPresets.json 本身,而且不會直接使用 選項叫用 --preset CMake。 因此,當您在 Visual Studio 內使用 建 CMakePresets.json 置時,不需要 CMake 3.20 版或更新版本。

我們建議至少使用 CMake 3.14 版或更新版本。

在 Visual Studio 中啟用 CMakePresets.json 整合

CMakePresets.json Visual Studio 中預設不會啟用整合。 您可以在 [工具選項 > ] [CMake > 一般 ] > 中 啟用它:

Screenshot showing 'Always use CMakePresets.json' selected.

從 Visual Studio 2022 功能表到達此畫面:[工具] > [選項] > CMake > [一般]。 選項位於 CMake 設定檔區段底下。

重要

關閉並重新開啟 Visual Studio 中的資料夾,以啟用整合。

在某些舊版 Visual Studio 中, [工具 > 選項 > ] CMake > [一般 ] 只有單一選項可啟用 CMakePresets.json 整合:

Screenshot of an older version of Visual Studio. There is a checkbox labeled 'Use C Make Presets .json to drive CMake configure, build, and test.'

下表指出 CMakePresets.json 何時使用 而不是 CMakeSettings.json 驅動 CMake 設定,並在 Visual Studio 2022 和 Visual Studio 2019 16.10 版和更新版本中建置。 如果沒有組態檔存在,則會使用預設的設定預設值。

在資料表中,「 已啟用工具 > 選項 」表示 使用 CMakePresets.json 來驅動 CMake 設定、建置和測試 在 [工具 > 選項 > ] 中選取 [CMake > 一般]。

組態檔 已停用工具 > 選項 已啟用工具 > 選項
沒有組態檔存在 CMakeSettings.json CMakePresets.json
CMakeSettings.json 目前 CMakeSettings.json CMakePresets.json
CMakePresets.json 目前 CMakePresets.json CMakePresets.json
這兩個組態檔都存在 CMakePresets.json CMakePresets.json

修改自動設定和快取通知

根據預設,Visual Studio 會在每次使用中目標系統或設定預設變更時自動叫 configure 用。 您可以在 [工具 > 選項 > ] CMake > [一般 ] 中 選取 [永不自動 執行設定] 步驟,以修改此行為。 您也可以清除 [顯示 CMake 快取通知] 來停用所有 CMake 快取通知(金條)。

預設設定預設值

如果不存在 CMakePresets.jsonCMakeUserPresets.json 檔案存在,或 CMakePresets.jsonCMakeUserPresets.json 無效,Visual Studio 會回復下列預設的設定預設值:

Windows 範例

{
  "name": "windows-default",
  "displayName": "Windows x64 Debug",
  "description": "Sets Ninja generator, compilers, x64 architecture, build and install directory, debug build type",
  "generator": "Ninja",
  "binaryDir": "${sourceDir}/out/build/${presetName}",
  "architecture": {
    "value": "x64",
    "strategy": "external"
  },
  "cacheVariables": {
    "CMAKE_BUILD_TYPE": "Debug",
    "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
  },
  "vendor": {
    "microsoft.com/VisualStudioSettings/CMake/1.0": {
      "hostOS": [ "Windows" ]
    }
  }
},

Linux 範例

{
  "name": "linux-default",
  "displayName": "Linux Debug",
  "description": "Sets Ninja generator, compilers, build and install directory, debug build type",
  "generator": "Ninja",
  "binaryDir": "${sourceDir}/out/build/${presetName}",
  "cacheVariables": {
    "CMAKE_BUILD_TYPE": "Debug",
    "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
  },
  "vendor": {
    "microsoft.com/VisualStudioSettings/CMake/1.0": {
      "hostOS": [ "Linux" ]
    },
    "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {
      "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"
   }
  }
}

如果您嘗試開啟或修改 CMakePresets.json 不存在的檔案,Visual Studio 會自動在專案的根目錄建立 CMakePresets.json 具有預設設定預設值的檔案。

設定和建置

在 Visual Studio 工具列上,啟用整合時 CMakePresets.json ,[目標系統]、[設定預設] 和 [建置預設] 下拉式清單:

Screenshot showing the dropdowns for target system set to Local Machine, configuration set to windows-arm64, and build preset set to default.

選取目標系統

左側的下拉式清單表示使用 中的目標系統 。 這是叫用 CMake 來設定和建置專案的系統。 此下拉式清單包含您的本機電腦、連線ion Manager 中的所有 SSH 連線,以及 Visual Studio 可找到的所有Windows 子系統 Linux 版 (WSL) 安裝:

Screenshot of the Target System dropdown list

下拉式清單包含數個專案,包括本機電腦、ip 位址 192.168.0.5、WSL:ubuntu2004、WSL:debian 和 Manage 連線ions。

在前述範例中:

  • 192.168.0.5 是已新增至 連線ion Manager 的遠端 Linux 系統。
  • ubuntu2004 debian 是 WSL 安裝。

選取 [ 管理連線] ,以開啟 連線ion Manager。

選取 [設定預設]

中間的下拉式清單表示使用 中的 [設定預設 ]。 這是 configurePreset 叫用 CMake 來產生專案建置系統時所使用的值。 此下拉式清單包含 和 CMakeUserPresets.jsonCMakePresets.json 定義的非隱藏設定預設值聯集。

Visual Studio 會使用 Microsoft Visual Studio 設定廠商對應中的 值 hostOS 來隱藏未套用至使用中目標系統的設定預設值。 如需詳細資訊,請參閱 Visual Studio 設定廠商對應 資料表中的 專案 hostOS

選取 [管理組態 ] 以開啟 CMakePresets.json 位於專案根目錄的檔案。 CMakePresets.json 如果尚未存在,則會建立它。

選取建置預設

右側的下拉式清單會指出使用 中的 [建置預設 ]。 這是 buildPreset 叫用 CMake 來建置專案時所使用的值。 此下拉式清單包含 和 CMakeUserPresets.jsonCMakePresets.json 定義的非隱藏組建預設聯集。

所有建置預設值都必須指定相關聯的 configurePreset 值。 Visual Studio 會隱藏不適用於使用中設定預設的組建預設。 如需詳細資訊,請參閱 建置預設 清單。

如果沒有與使用中 [設定預設] 相關聯的 [建置預設],Visual Studio 會列出預設的 [建置預設]。 預設的 [建置預設] 相當於從命令列傳遞 cmake --build 沒有其他引數。

設定

Visual Studio 會在偵測到 CMake 快取過期時自動嘗試設定專案。 若要手動叫用設定,請從主功能表中選取 [專案 > 設定 < 專案名稱]。 > 這與從命令列執行 cmake --preset <configurePreset> 相同,其中 <configurePreset> 是使用中設定預設的名稱。

若要停用自動快取產生,請參閱 自動設定和快取通知

組建

若要建置整個專案,請從主功能表中選取 [全部建 > 置]。 這與從命令列執行 cmake --build --preset <buildPreset> 相同,其中 <buildPreset> 是使用中組建預設的名稱。

若要建置單一目標,請切換至 方案總管 中的 CMake 目標檢視 。 然後以滑鼠右鍵按一下任何目標,然後從快捷方式功能表中選取 [ 置]。

注意

Visual Studio 2019 不支援 buildPresets.targets 建置 中所 CMakePresets.json 指定目標子集的選項。

執行 CTest

CMakePresets.json 支援 Visual Studio 2019 中的兩個功能表選項:

  • > 專案名稱 > 的測試 < 執行 CTest 會叫用 CTest,並執行與使用中設定預設和建置預設相關聯的所有測試,而沒有傳遞至 CTest 的其他引數。
  • test > Run Test Preset for < configurePreset > expands to show all Test Presets associated with the active Configure Preset. 選取單一測試預設與從命令列執行 ctest --preset <testPreset> 相同,其中 <testPreset> 是所選測試預設的名稱。 如果未針對使用中設定預設定義任何測試預設值,則無法使用此選項。

在 Visual Studio 2019 中,測試總管未與 CMakePresets.json 整合。

新增預設

在 Visual Studio 2019 中,所有命令和預設範本都會修改 CMakePresets.json 。 您可以直接編輯 CMakeUserPresets.json 來新增使用者層級預設。

針對 和 CMakeUserPresets.json 中的 CMakePresets.json 路徑使用正斜線 ( / )。

新增設定預設值

若要將新的 [設定預設值] 新增至 CMakePresets.json ,請從 方案總管 [ 資料夾檢視 ] 按一下滑鼠右鍵 CMakePresets.json ,然後從快捷方式功能表選取 [新增組態 ]。 選取 [設定預設] 範本的對話方塊隨即出現:

Screenshot of the Add Configure Preset to the JSON file dialog. It contains entries such as Linux Debug, macOS Debug, x64 Debug, and so on.

選取 Windows x64 偵錯 範本,以在 Windows 系統上設定。 選取 Linux 偵錯 範本,以在 WSL 和遠端 Linux 系統上設定。 如需編輯 CMakePresets.json 的詳細資訊,請參閱 編輯預設值

如果選取的範本存在,則會新增至 CMakePresets.json 該範本。 否則,範本會複製到新的 CMakePresets.json 檔案中。

新增組建預設和測試預設

Visual Studio 2019 不提供新組建預設和測試預設的範本。 您可以直接編輯 CMakePresets.json 來新增 [建置預設] 和 [測試預設]。 如需詳細資訊,請參閱 建置預設清單、 測試預設 清單或 範例 CMakePresets.json 檔案

編輯預設

官方 CMake 檔 是編輯設定預設、建置預設和測試預設的最佳資源。 下列資訊是 CMake 檔的子集,特別與 Visual Studio 開發人員相關。

選取您的編譯器

您可以在 [設定預設] 中使用 cacheVariables.CMAKE_C_COMPILERcacheVariables.CMAKE_CXX_COMPILER 來設定 C 和 C++ 編譯器。 這相當於從命令列傳遞 -D CMAKE_C_COMPILER=<value>-D CMAKE_CXX_COMPILER=<value> 傳遞至 CMake。 如需詳細資訊,請參閱CMAKE_<LANG>_COMPILER

使用下列範例來建置 Visual Studio 中的 cl.execlang-cl.exe 。 您必須安裝適用于 Windows 元件的 C++ Clang 工具,才能使用 clang-cl 進行建置。

使用 建置 cl.exe

"cacheVariables": {
  "CMAKE_BUILD_TYPE": "Debug",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
  "CMAKE_C_COMPILER": "cl",
  "CMAKE_CXX_COMPILER": "cl"
},

使用 建置 clang

"cacheVariables": {
  "CMAKE_BUILD_TYPE": "Debug",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
  "CMAKE_C_COMPILER": "clang-cl",
  "CMAKE_CXX_COMPILER": "clang-cl"
},

"vendor": {
  "microsoft.com/VisualStudioSettings/CMake/1.0": {
    "intelliSenseMode": "windows-clang-x64"
  }
}

如果您使用 Visual Studio 16 2019Visual Studio 17 2022 作為產生器,您可以使用 [ toolset 設定預設] 來指定 ClangCL 工具組:

"cacheVariables": {
  "CMAKE_BUILD_TYPE": "Debug",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
},

"toolset": "ClangCL",

"vendor": {
  "microsoft.com/VisualStudioSettings/CMake/1.0": {
    "intelliSenseMode": "windows-clang-x64"
  }
}

如需支援 toolset 規格之產生器的詳細資訊,請參閱 CMAKE_GENERATOR_TOOLSET CMake 檔中的 。

重要

在 Visual Studio 2019 中,當您使用 或 clang-cl 建置 clang 時,必須明確指定 Clang IntelliSense 模式。

若要在 Visual Studio 外部重現這些組建,請參閱 從命令列或 CI 管線 執行 CMake。

若要在 Linux 上建置,或不使用 Visual C++ 工具組,請在實例 PATH 上指定編譯器的名稱,或評估為編譯器完整路徑的環境變數。 不建議使用完整路徑,讓檔案可以保持可共用。 使用 GCC 第 8 版建置的預設值可能如下所示:

"cacheVariables": {
  "CMAKE_BUILD_TYPE": "Debug",
  "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
  "CMAKE_C_COMPILER": "gcc-8",
  "CMAKE_CXX_COMPILER": "g++-8"
},

您也可以使用 CMake 工具鏈檔案來設定編譯器。 工具鏈檔案可以使用 來設定 cacheVariables.CMAKE_TOOLCHAIN_FILE ,這相當於從命令列傳遞 -D CMAKE_TOOLCHAIN_FILE=<value> 至 CMake。 CMake 工具鏈檔案最常用於交叉編譯。 如需撰寫 CMake 工具鏈檔案的詳細資訊,請參閱 CMake 工具鏈

選取您的產生器

Windows 和 Linux 設定預設範本都會將 Ninja 指定為預設產生器。 其他常見的產生器是 Windows 上的 Visual Studio 產生器 ,Linux 和 macOS 上的 Unix Makefiles。 您可以使用 [設定預設] 中的 選項來指定新的產生器 generator 。 這相當於從命令列傳遞 -G 至 CMake。

當您使用 Visual Studio 產生器建置時,請將 和 toolset.strategy 設定 architecture.strategyset 。 如需詳細資訊,請參閱 CMake 產生器

選取您的組態類型

您可以使用 來設定單一組態產生器的 cacheVariables.CMAKE_BUILD_TYPE 組態類型 ( DebugRelease )。 這相當於從命令列傳遞 -D CMAKE_BUILD_TYPE=<value> 至 CMake。 如需詳細資訊,請參閱CMAKE_BUILD_TYPE

使用 Visual C++ 工具組建置時,選取您的目標和主機架構

您可以使用 來設定目標架構 (x64、Win32、ARM64 或 ARM)。 architecture.value 這相當於從命令列傳遞 -A 至 CMake。 如需詳細資訊,請參閱 平臺選取

注意

目前,Visual Studio 產生器預期 Win32 語法和命令列產生器(例如 Ninja)在建置 x86 時需要 x86 語法。

您可以使用 來設定主機架構 (x64 或 x86) 和工具組 toolset.value 。 這相當於從命令列傳遞 -T 至 CMake。 如需詳細資訊,請參閱 工具組選取

architecture.strategytoolset.strategy 值會告知 CMake 如何處理架構和工具組欄位。 set 表示 CMake 會設定個別的值,而 external 表示 CMake 不會設定個別的值。

我們建議搭配 IDE 產生器使用 set ,例如 Visual Studio 產生器。 與命令列產生器搭配使用 external ,例如 Ninja。 這些值可讓 Visual Studio 等廠商在叫用 CMake 之前提供必要的環境。 如需架構和工具組欄位的詳細資訊,請參閱設定 預設 清單。

如果您不想建立環境的來源,您可以將 設定 architecture.strategyexternalarchitecture.valueunspecified 您可能會發現,基於下列任何一個原因,不要為環境提供來源會很有用:

  • 您使用 MSVC 以外的工具組。
  • 您可以使用自訂工具鏈,例如內嵌案例。
  • 您不需要特定環境來建置。

如需支援架構欄位之 IDE 產生器的完整清單,請參閱 CMAKE_GENERATOR_PLATFORM 。 如需支援工具組欄位之 IDE 產生器的完整清單,請參閱 CMAKE_GENERATOR_TOOLSET

使用下列範例以 Arm64 與 Ninja 產生器為目標,或以 Visual Studio 16 2019 產生器為目標 Win32 (x86):

"generator": "Ninja",
"architecture": {
    "strategy": "external",
    "value": "arm64"
},

"generator": "Visual Studio 16 2019",
"architecture": {
    "strategy": "set",
     "value": "Win32"
},

設定和參考環境變數

您可以使用環境對應來設定環境變數。 環境變數會透過 inherits 欄位繼承,但您可以視需要覆寫它們。

預設的環境是本身環境的聯集,以及來自其所有父系的環境。 如果多個 inherits 預設提供相同變數的衝突值,則建議使用清單中的先前預設值 inherits 。 您可以將變數設定為 null ,以取消設定繼承自另一個預設的變數。

在 [設定預設] 中設定的環境變數也會自動流向相關聯的建置預設和測試預設,除非 inheritConfigureEnvironment 設定為 false 。 如需詳細資訊,請參閱設定 預設值 的清單。

您可以使用 和 $penv{<variable-name>} 語法來參考環境變數 $env{<variable-name>} 。 如需詳細資訊,請參閱 宏擴充

設定跨編譯器的 IntelliSense

根據預設,Visual Studio 會使用符合您指定工具組和目標架構的 IntelliSense 模式。 如果您要交叉編譯,您可能需要使用 intelliSenseMode Visual Studio 設定 廠商對應中的 選項,手動指定正確的 IntelliSense 模式。 如需詳細資訊,請參閱 Visual Studio 設定廠商對應 資料表中的 專案 intelliSenseMode

在遠端系統或Windows 子系統 Linux 版上設定和建置

透過 CMakePresets.json Visual Studio 中的支援,您可以輕鬆地在 Windows、WSL 和遠端系統上設定和建置專案。 在 Windows、遠端系統或 WSL 上設定和建置 專案的步驟相同。 不過,一些行為是遠端開發特有的。

${sourceDir} 遠端複製案例中的行為

在本機案例中,評估 ${sourceDir} 為 Visual Studio 中開啟的專案來原始目錄路徑。 在遠端複製案例中, ${sourceDir} 評估為目標系統上的專案來原始目錄路徑,而不是本機電腦上的專案來原始目錄。

Visual Studio Remote 設定廠商對應中的 值 sourceDir 會決定目標系統上的專案來原始目錄(預設值為 $env{HOME}/.vs/$ms{projectDirName} )。 如需詳細資訊,請參閱 Visual Studio 設定廠商對應 資料表中的 專案 sourceDir

遠端輸出的本機資料夾

如果 copyBuildOutput Visual Studio 遠端設定廠商對應設定 true 為 ,遠端複製案例需要本機目錄來複製一些遠端檔案,例如 CMake 檔案 API 回應檔或建置檔案。 這些檔案會自動複製到 <local-source-directory>/out/<remote-connection-ID>/build/${presetName}

在 Windows 和 WSL1 上叫用相同的設定預設值

如果您嘗試在 Windows 和 WSL1 上使用相同的設定預設值,就會看到錯誤。 Windows 和 WSL1 都使用 Windows 檔案系統,因此 CMake 會嘗試針對 Windows 和 WSL1 建置樹狀結構使用相同的輸出目錄 ( binaryDir )。

如果您想要搭配 Windows 和 WSL1 工具組使用相同的設定預設,請建立繼承自原始預設的第二個設定預設值,並指定新的 binaryDir 值。 在下列範例中, windows-preset 可以在 Windows 上使用,而且 base-preset 可以在 WSL1 上使用:

{
  "name": "windows-preset",
  "inherits": "base-preset",
  "binaryDir": "${sourceDir}/out/build/${presetName}",
  "vendor": {
    "microsoft.com/VisualStudioSettings/CMake/1.0": {
      "hostOS": "Windows"
    }
  }
}

注意

在 Visual Studio 2019 中,僅支援 WSL1 工具組。 您可以隨時在 Windows 和 WSL 上叫 configure 用此行為。

啟用 vcpkg 整合

Vcpkg 可協助您管理 Windows、Linux 和 macOS 上的 C 和 C++ 程式庫。 vcpkg 工具鏈檔案 ( vcpkg.cmake ) 必須傳遞至 CMake,才能啟用 vcpkg 整合。 如需詳細資訊,請參閱 vcpkg 檔

Visual Studio 不再會在啟用整合時 CMakePresets.json 自動將 vcpkg 工具鏈檔案傳遞至 CMake。 這項變更可排除 Visual Studio 特定的行為,並確保您可以從命令列重現組建。

請改用 VCPKG_ROOT 中的 CMakePresets.json 環境變數,將 路徑設定為 vcpkg.cmake

"cacheVariables": {
   "CMAKE_TOOLCHAIN_FILE": {
      "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
       "type": "FILEPATH"
    }
 },

VCPKG_ROOT 應該設定為 vcpkg 安裝的根目錄。 如需詳細資訊,請參閱 vcpkg 環境變數

如果您已經使用 CMake 工具鏈檔案並想要啟用 vcpkg 整合,請參閱 使用多個工具鏈檔案 。 請遵循這些指示,使用 vcpkg 搭配專案使用外部工具鏈檔案。

和 中的 launch.vs.json 變數替代 tasks.vs.json

CMakePresets.json支援 和 tasks.vs.json 中的 launch.vs.json 變數替代。 以下是一些考慮:

  • 使用中 [設定預設] 中設定的環境變數會自動流向 launch.vs.jsontasks.vs.json 設定。 您可以在 中 launch.vs.jsontasks.vs.json 取消設定個別環境變數,方法是將其設定為 null 。 下列範例會將 中的 launch.vs.json 變數 DEBUG_LOGGING_LEVEL 設定為 null"env": { "DEBUG_LOGGING_LEVEL": null }

  • 使用中 [設定預設] 中所設定的索引鍵值可用於 和 launch.vs.jsontasks.vs.json 語法 ${cmake.<KEY-NAME>} 。 例如,使用 ${cmake.binaryDir} 來參考使用中設定預設的輸出目錄。

  • 使用中 [設定預設] 環境對應中設定的個別環境變數,可透過 語法 ${env.<VARIABLE-NAME>} 在 和 tasks.vs.json 中使用 launch.vs.json

將 和 launch.vs.jsontask.vs.json 檔案更新為參考 CMakePresets.json 語法, CMakeSettings.json 而不是語法。 當現用組態檔為現用組態檔時 CMakePresets.json ,參考舊 CMakeSettings.json 語法的宏會在未來版本中進行淘汰。 例如,使用 來參考使用中設定預設 ${cmake.binaryDir} 的輸出目錄, ${cmake.buildRoot} 而不是 ,因為 CMakePresets.json 會使用 binaryDir 語法。

疑難排解

如果事情未如預期般運作,您可以嘗試幾個疑難排解步驟。

CMakePresets.json如果 或 CMakeUserPresets.json 無效,Visual Studio 會回復其預設行為,並只顯示預設的設定預設值。 Visual Studio IntelliSense 可協助您擷取其中許多 JSON 錯誤,但不知道您是否以或 configurePreset 錯誤名稱參考預設 inherits

若要檢查您的預設檔案是否有效,請從專案目錄根目錄的命令列執行 cmake --list-presets 。 (需要 CMake 3.20 或更新版本。如果其中一個檔案無效,您會看到下列錯誤:

CMake Error: Could not read presets from
C:/Users/<user>/source/repos/<project-name>: JSON parse error

其他疑難排解步驟包括:

  • 刪除快取並重新設定專案( CMake:刪除快取 專案設定 < 專案 > 名稱)。 >
  • 關閉並重新開啟 Visual Studio 中的資料夾( 檔案 > 關閉資料夾 )。
  • .vs刪除專案根目錄的資料夾。

如果您發現問題,最好的報告方式是選取 Visual Studio 右上角的 [傳送意見反應 ] 按鈕。

啟用遠端連線的記錄功能

如果您在連線或將檔案複製到遠端系統時遇到問題,您可以啟用遠端連線的記錄功能。 如需詳細資訊,請參閱 遠端連線 的記錄。

啟用適用于 Windows 和 Linux 的 AddressSanitizer

Visual Studio 支援適用于 Windows 和 Linux 開發的 AddressSanitizer (ASAN),C 和 C++ 執行時間記憶體錯誤偵測器。 addressSanitizerEnabled中的 CMakeSettings.json 選項會啟用 AddressSanitizer。 CMakePresets.json 不支援此行為。

相反地,請自行設定必要的編譯器和連結器旗標,以啟用和停用 AddressSanitizer。 設定它們會移除 Visual Studio 特定的行為,並確保相同的 CMakePresets.json 檔案可以從命令列重現您的組建。

您可以將下列範例新增至 , CMakeLists.txt 以啟用或停用目標的 AddressSanitizer:

option(ASAN_ENABLED "Build this target with AddressSanitizer" ON)

if(ASAN_ENABLED)
  if(MSVC)
    target_compile_options(<target> PUBLIC /fsanitize=address)
  else()
    target_compile_options(<target> PUBLIC -fsanitize=address <additional-options>)
    target_link_options(<target> PUBLIC -fsanitize=address)
  endif()
endif()

元件 <additional-options> 會列出其他編譯旗標,例如 "-fno-omit-frame-pointer" 。 如需適用于 Linux 的 AddressSanitizer 的詳細資訊,請參閱 使用 AddressSanitizer 。 如需搭配 MSVC 使用 AddressSanitizer 的詳細資訊,請參閱 從開發人員命令提示字元 使用 AddressSanitizer。

使用 ASAN_OPTIONS 中的 launch.vs.json 欄位,將執行時間旗標傳遞至 AddressSanitizer。 ASAN_OPTIONSdetect_leaks=0當 Visual Studio 中不支援 LeakSanitizer,因此未指定其他執行時間選項時,預設為 。

從命令列或 CI 管線執行 CMake

您可以使用相同的 CMakePresets.jsonCMakeUserPresets.json 檔案,從 Visual Studio 和命令列叫用 CMake。 CMake 和 CTest 檔是使用 叫用 --preset CMake 和 CTest 的最佳資源。 需要 CMake 3.20 版或更新版本。

在 Windows 上使用命令列產生器建置時,採購環境

在使用命令列產生器建置 CMake 之前,使用者必須先設定環境。 如果您要在 Windows 上使用 Ninja 和 Visual C++ 工具組進行建置,請在呼叫 CMake 以產生建置系統之前設定環境。 您可以使用 引數呼叫 vcvarsall.batarchitecture 來執行此動作。 自 architecture 變數會指定要使用的主機和目標架構。 如需詳細資訊,請參閱 vcvarsall 語法 。 如果您使用 Visual Studio 產生器在 Linux 或 Windows 上建置,就不需要執行此步驟。

當 IDE 叫用 CMake 時,Visual Studio 會為您採取的步驟相同。 Visual Studio 會剖析 和 所 toolsetarchitecture 指定主機和目標架構的作用中設定預設值。 Visual Studio 接著會從 vcvarsall.bat 產生指定的環境。 當您使用 Ninja 從 Windows 命令列建置時,您必須自行執行此步驟。

vcvarsall.bat 會隨 Visual Studio 的 Build Tools 一起安裝。 根據預設, vcvarsall.bat 會安裝在 中 C:\Program Files (x86)\Microsoft Visual Studio\2019\<edition>\VC\Auxiliary\Build 。 如果您經常使用命令列工作流程,可以新增 vcvarsall.batPATH

命令列工作流程範例

您可以使用下列命令來設定及建置使用 Ninja 以 ARM64 搭配 x64 建置工具的 CMake 專案。 需要 CMake 3.20 版或更新版本。 從檔案 CMakePresets.json 所在的目錄執行下列命令:

/path/to/vcvarsall.bat x64_arm64 
cmake --list-presets=all .
cmake --preset <configurePreset-name>
cmake --build --preset <buildPreset-name> 

範例 CMakePresets.json 檔案

CMakePresets.jsonbox2d-lite 中的 檔案包含設定預設、建置預設和測試預設的範例。 如需此範例的詳細資訊,請參閱 CMakePresets.json 簡介簡報 。 您可以在 DirectXTK 專案中看到另一個範例 ,其區段中會顯示許多建置目標 configurePresets

下一步

在 Visual Studio 中深入了解設定和偵錯 CMake 專案: