cmake-toolchains(7)

簡介

CMake 使用工具鏈來編譯、連結程式庫、建立封存檔,以及其他驅動建置的任務。可用的工具鏈工具取決於啟用的程式語言。在正常的建置中,CMake 會根據系統內省和預設值自動決定主機建置的工具鏈。在交叉編譯的情境下,可以使用工具鏈檔案指定編譯器和工具路徑的相關資訊。

在 3.19 版本中新增:可以使用 cmake-presets(7) 來指定工具鏈檔案。

程式語言

程式語言是透過 project() 命令來啟用的。特定於程式語言的內建變數,例如 CMAKE_CXX_COMPILERCMAKE_CXX_COMPILER_ID 等等,都是透過調用 project() 命令來設定的。如果頂層的 CMakeLists 檔案中沒有 project 命令,將會隱式產生一個。預設情況下,啟用的程式語言是 CCXX

project(C_Only C)

也可以將 NONE 這個特殊值與 project() 命令一起使用,以停用任何程式語言。

project(MyProject NONE)

可以使用 enable_language() 命令在 project() 命令之後啟用程式語言。

enable_language(CXX)

當啟用某個程式語言時,CMake 會尋找該程式語言的編譯器,並判斷一些資訊,例如編譯器的供應商和版本、目標架構和位元寬度、相應工具的位置等等。

ENABLED_LANGUAGES 全域屬性包含目前已啟用的程式語言。

變數與屬性

有幾個變數與已啟用工具鏈的程式語言組件相關。

CMAKE_<LANG>_COMPILER

用於 <LANG> 的編譯器完整路徑。

CMAKE_<LANG>_COMPILER_ID

CMake 使用的編譯器識別碼。

CMAKE_<LANG>_COMPILER_VERSION

編譯器的版本。

CMAKE_<LANG>_FLAGS

這些變數和特定於組態的對應變數包含在編譯特定程式語言的檔案時將新增到編譯命令中的旗標。

CMake 需要一種方式來決定要使用哪個編譯器來調用連結器。這由 LANGUAGE 屬性來決定,該屬性屬於 target 的原始檔,在靜態程式庫的情況下,則取決於相依程式庫的 LANGUAGE。CMake 所做的選擇可以使用 LINKER_LANGUAGE 目標屬性來覆寫。

工具鏈功能

CMake 提供了 try_compile() 命令和包裝巨集,例如 CheckSourceCompilesCheckCXXSymbolExistsCheckIncludeFile,來測試各種工具鏈功能的性能和可用性。這些 API 會以某種方式測試工具鏈,並快取結果,以便下次執行 CMake 時不必再次執行測試。

有些工具鏈功能在 CMake 中具有內建的處理,不需要編譯測試。例如,POSITION_INDEPENDENT_CODE 允許指定應將目標建置為位置獨立程式碼,如果編譯器支援該功能。如果編譯器支援,<LANG>_VISIBILITY_PRESETVISIBILITY_INLINES_HIDDEN 目標屬性會新增用於隱藏可見度的旗標。

交叉編譯

如果使用命令列參數 --toolchain path/to/file-DCMAKE_TOOLCHAIN_FILE=path/to/file 調用 cmake(1),則該檔案將會提前載入以設定編譯器的值。當 CMake 正在進行交叉編譯時,CMAKE_CROSSCOMPILING 變數會設定為 true。

請注意,在工具鏈檔案內使用 CMAKE_SOURCE_DIRCMAKE_BINARY_DIR 變數通常是不可取的。工具鏈檔案會在不同的位置使用這些變數時具有不同值的環境中使用(例如,作為調用 try_compile() 的一部分)。在大多數需要評估工具鏈檔案內的路徑的情況下,更適合使用的變數是 CMAKE_CURRENT_LIST_DIR,因為它始終具有明確、可預測的值。

針對 Linux 進行交叉編譯

典型的 Linux 交叉編譯工具鏈具有以下內容:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)

set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

其中

CMAKE_SYSTEM_NAME

是 CMake 中要建置的目標平台識別碼。

CMAKE_SYSTEM_PROCESSOR

是 CMake 中目標架構的識別碼。

CMAKE_SYSROOT

是選用的,如果 sysroot 可用,則可以指定。

CMAKE_STAGING_PREFIX

也是可選的。它可以用來指定主機上安裝的路徑。CMAKE_INSTALL_PREFIX 始終是執行階段的安裝位置,即使是交叉編譯時也是如此。

CMAKE_<LANG>_COMPILER

變數可以設定為完整路徑,或是在標準位置搜尋的編譯器名稱。對於不支援在沒有自訂旗標或腳本的情況下連結二進制檔的工具鏈,可以將 CMAKE_TRY_COMPILE_TARGET_TYPE 變數設定為 STATIC_LIBRARY,以告知 CMake 在檢查期間不要嘗試連結可執行檔。

CMake 的 find_* 指令會在 sysroot 中搜尋,並且預設情況下,也會在 CMAKE_FIND_ROOT_PATH 條目中搜尋,以及主機系統根目錄前綴中搜尋。雖然可以逐個案例控制,但在交叉編譯時,排除在主機或目標中搜尋特定 Artifact 可能會很有用。一般來說,應在目標系統前綴中找到 include、函式庫和套件,而必須作為建置一部分執行的可執行檔,則應只在主機上找到,而不是在目標上。這就是 CMAKE_FIND_ROOT_PATH_MODE_* 變數的目的。

為 Cray Linux 環境進行交叉編譯

在 Cray Linux 環境中為運算節點進行交叉編譯,無需單獨的工具鏈檔案。在 CMake 命令列上指定 -DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment 將確保配置適當的建置設定和搜尋路徑。該平台將從當前的環境變數中提取其配置,並將專案配置為使用 Cray Programming Environment 的 PrgEnv-* 模組中的編譯器封裝程式(如果存在並已載入)。

Cray Programming Environment 的預設配置是僅支援靜態函式庫。可以覆寫此設定,並透過將 CRAYPE_LINK_TYPE 環境變數設定為 dynamic 來啟用共享函式庫。

執行 CMake 而不指定 CMAKE_SYSTEM_NAME 將在主機模式下執行配置步驟,並假設為標準的 Linux 環境。如果未覆寫,PrgEnv-* 編譯器封裝程式最終將被使用,如果目標是登入節點或運算節點,這可能不是預期的行為。例外情況是您直接在 NID 上建置,而不是從登入節點進行交叉編譯。如果嘗試為登入節點建置軟體,您需要先卸載目前已載入的 PrgEnv-* 模組,或明確告知 CMake 使用 /usr/bin 中的系統編譯器,而不是 Cray 封裝程式。如果想要以運算節點為目標,只需如上所述指定 CMAKE_SYSTEM_NAME 即可。

使用 Clang 進行交叉編譯

某些編譯器(例如 Clang)本質上是交叉編譯器。可以在編譯時設定 CMAKE_<LANG>_COMPILER_TARGET,以將值傳遞給這些受支援的編譯器

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(triple arm-linux-gnueabihf)

set(CMAKE_C_COMPILER clang)
set(CMAKE_C_COMPILER_TARGET ${triple})
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_CXX_COMPILER_TARGET ${triple})

同樣地,有些編譯器不提供自己的補充工具程式(例如連結器),但提供了一種方法來指定編譯器驅動程式將使用的外部工具鏈位置。可以在工具鏈檔案中設定 CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN 變數,以將路徑傳遞給編譯器驅動程式。

為 QNX 進行交叉編譯

與 Clang 編譯器一樣,QNX QCC 編譯本質上是一個交叉編譯器。可以在編譯時設定 CMAKE_<LANG>_COMPILER_TARGET,以將值傳遞給這些受支援的編譯器。

set(CMAKE_SYSTEM_NAME QNX)

set(arch gcc_ntoarmv7le)

set(CMAKE_C_COMPILER qcc)
set(CMAKE_C_COMPILER_TARGET ${arch})
set(CMAKE_CXX_COMPILER QCC)
set(CMAKE_CXX_COMPILER_TARGET ${arch})

set(CMAKE_SYSROOT $ENV{QNX_TARGET})

為 Windows CE 進行交叉編譯

為 Windows CE 進行交叉編譯需要在您的系統上安裝對應的 SDK。這些 SDK 通常安裝在 C:/Program Files (x86)/Windows CE Tools/SDKs 下。

為 Windows CE 配置 Visual Studio 產生器的工具鏈檔案可能如下所示

set(CMAKE_SYSTEM_NAME WindowsCE)

set(CMAKE_SYSTEM_VERSION 8.0)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_GENERATOR_TOOLSET CE800) # Can be omitted for 8.0
set(CMAKE_GENERATOR_PLATFORM SDK_AM335X_SK_WEC2013_V310)

CMAKE_GENERATOR_PLATFORM 告知產生器要使用哪個 SDK。此外,CMAKE_SYSTEM_VERSION 告知產生器要使用哪個版本的 Windows CE。目前,版本 8.0(Windows Embedded Compact 2013)開箱即用。其他版本可能需要將 CMAKE_GENERATOR_TOOLSET 設定為正確的值。

為 Windows 10 通用應用程式進行交叉編譯

為 Windows 10 通用應用程式配置 Visual Studio 產生器 的工具鏈檔案可能如下所示

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 10.0)

Windows 10 通用應用程式的目標是 Windows 市集和 Windows Phone。將 CMAKE_SYSTEM_VERSION 變數指定為 10.0 或更高版本。

CMake 選擇 Windows SDK,如 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 變數的文件所述。

為 Windows Phone 進行交叉編譯

為 Windows Phone 配置 Visual Studio 產生器的工具鏈檔案可能如下所示

set(CMAKE_SYSTEM_NAME WindowsPhone)
set(CMAKE_SYSTEM_VERSION 8.1)

為 Windows 市集進行交叉編譯

為 Windows 市集配置 Visual Studio 產生器的工具鏈檔案可能如下所示

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 8.1)

為 ADSP SHARC/Blackfin 進行交叉編譯

可以透過將 CMAKE_SYSTEM_NAME 變數設定為 ADSP,並將 CMAKE_SYSTEM_PROCESSOR 變數設定為「零件編號」(不包括 ADSP- 前綴)來配置為 ADSP SHARC 或 Blackfin 進行交叉編譯,例如 21594SC589 等。此值不區分大小寫。

CMake 將自動搜尋預設安裝位置中的 CCES 或 VDSP++ 安裝,並選擇找到的最新版本。如果同時安裝了 CCES 和 VDSP++,則會選擇 CCES。可以使用 CMAKE_ADSP_ROOT 變數或 ADSP_ROOT 環境變數設定自訂安裝路徑。

編譯器 (cc21k vs. ccblkfn) 會根據提供的 CMAKE_SYSTEM_PROCESSOR 值自動選擇。

為 Android 進行交叉編譯

工具鏈檔案可以透過將 CMAKE_SYSTEM_NAME 變數設定為 Android 來設定 Android 的交叉編譯。進一步的設定則依據所使用的 Android 開發環境而定。

對於 Visual Studio 產生器,CMake 期望安裝 NVIDIA Nsight Tegra Visual Studio Edition適用於 Android 的 Visual Studio 工具。請參閱這些章節以取得進一步的設定詳細資訊。

對於 Makefile 產生器Ninja 產生器,CMake 期望使用下列其中一種環境

CMake 使用下列步驟來選擇其中一種環境

  • 如果設定了 CMAKE_ANDROID_NDK 變數,將使用指定位置的 NDK。

  • 否則,如果設定了 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 變數,將使用指定位置的獨立工具鏈。

  • 否則,如果 CMAKE_SYSROOT 變數設定為 <ndk>/platforms/android-<api>/arch-<arch> 形式的目錄,則 <ndk> 部分將用作 CMAKE_ANDROID_NDK 的值,並將使用 NDK。

  • 否則,如果 CMAKE_SYSROOT 變數設定為 <standalone-toolchain>/sysroot 形式的目錄,則 <standalone-toolchain> 部分將用作 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 的值,並將使用獨立工具鏈。

  • 否則,如果設定了 cmake 變數 ANDROID_NDK,它將用作 CMAKE_ANDROID_NDK 的值,並將使用 NDK。

  • 否則,如果設定了 cmake 變數 ANDROID_STANDALONE_TOOLCHAIN,它將用作 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 的值,並將使用獨立工具鏈。

  • 否則,如果設定了環境變數 ANDROID_NDK_ROOTANDROID_NDK,它將用作 CMAKE_ANDROID_NDK 的值,並將使用 NDK。

  • 否則,如果設定了環境變數 ANDROID_STANDALONE_TOOLCHAIN,它將用作 CMAKE_ANDROID_STANDALONE_TOOLCHAIN 的值,並將使用獨立工具鏈。

  • 否則,將發出錯誤診斷,指出找不到 NDK 或獨立工具鏈。

在 3.20 版本中新增: 如果選擇了 Android NDK,其版本號碼會記錄在 CMAKE_ANDROID_NDK_VERSION 變數中。

使用 NDK 為 Android 進行交叉編譯

工具鏈檔案可以設定 Makefile 產生器Ninja 產生器Visual Studio 產生器,以針對 Android 進行交叉編譯。

透過以下變數設定使用 Android NDK

CMAKE_SYSTEM_NAME

設定為 Android。必須指定才能啟用 Android 的交叉編譯。

CMAKE_SYSTEM_VERSION

設定為 Android API 層級。如果未指定,則會按以下方式確定該值

  • 如果設定了 CMAKE_ANDROID_API 變數,則會使用其值作為 API 層級。

  • 如果設定了 CMAKE_SYSROOT 變數,則會從包含 sysroot 的 NDK 目錄結構中偵測 API 層級。

  • 否則,將使用 NDK 中可用的最新 API 層級。

CMAKE_ANDROID_ARCH_ABI

設定為 Android ABI(架構)。如果未指定,此變數將預設為 armeabiarmeabi-v7aarm64-v8a 清單中第一個支援的 ABI。CMAKE_ANDROID_ARCH 變數將從 CMAKE_ANDROID_ARCH_ABI 自動計算。另請參閱 CMAKE_ANDROID_ARM_MODECMAKE_ANDROID_ARM_NEON 變數。

CMAKE_ANDROID_NDK

設定為 Android NDK 根目錄的絕對路徑。如果未指定,將按照上述指定的方式選擇此變數的預設值。

CMAKE_ANDROID_NDK_DEPRECATED_HEADERS

設定為 true 值,以使用已棄用的每個 API 層級標頭,而不是統一標頭。如果未指定,則預設值將為 false,除非使用不提供統一標頭的 NDK。

CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION

在 NDK r19 或更高版本中,此變數必須取消設定或設定為 clang。在 NDK r18 或更低版本中,將此設定為要選取為編譯器的 NDK 工具鏈版本。如果未指定,則預設值將為最新的可用 GCC 工具鏈。

CMAKE_ANDROID_STL_TYPE

設定以指定要使用的 C++ 標準程式庫。如果未指定,將按照變數文件中所述選擇預設值。

以下變數將自動計算並提供

CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX

NDK 工具鏈中 binutils 的絕對路徑前綴。

CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX

NDK 工具鏈中 binutils 的主機平台後綴。

例如,工具鏈檔案可能包含

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21) # API level
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
set(CMAKE_ANDROID_NDK /path/to/android-ndk)
set(CMAKE_ANDROID_STL_TYPE gnustl_static)

或者,您也可以在不使用工具鏈檔案的情況下指定這些值

$ cmake ../src \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=21 \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_ANDROID_NDK=/path/to/android-ndk \
  -DCMAKE_ANDROID_STL_TYPE=gnustl_static

使用獨立工具鏈為 Android 進行交叉編譯

工具鏈檔案可以配置 Makefile 產生器Ninja 產生器,以便使用獨立工具鏈針對 Android 進行交叉編譯。

使用以下變數配置 Android 獨立工具鏈的使用

CMAKE_SYSTEM_NAME

設定為 Android。必須指定才能啟用 Android 的交叉編譯。

CMAKE_ANDROID_STANDALONE_TOOLCHAIN

設定為獨立工具鏈根目錄的絕對路徑。${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/sysroot 目錄必須存在。如果未指定,則將選擇此變數的預設值,如上方所述。

CMAKE_ANDROID_ARM_MODE

當獨立工具鏈目標為 ARM 時,您可以選擇將其設定為 ON,以目標 32 位元 ARM 而不是 16 位元 Thumb。請參閱變數文件以瞭解詳細資訊。

CMAKE_ANDROID_ARM_NEON

當獨立工具鏈目標為 ARM v7 時,您可以選擇將其設定為 ON,以目標 ARM NEON 裝置。請參閱變數文件以瞭解詳細資訊。

以下變數將自動計算並提供

CMAKE_SYSTEM_VERSION

從獨立工具鏈偵測到的 Android API 層級。

CMAKE_ANDROID_ARCH_ABI

從獨立工具鏈偵測到的 Android ABI。

CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX

獨立工具鏈中 binutils 的絕對路徑前綴。

CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX

獨立工具鏈中 binutils 的主機平台後綴。

例如,工具鏈檔案可能包含

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_ANDROID_STANDALONE_TOOLCHAIN /path/to/android-toolchain)

或者,您也可以在不使用工具鏈檔案的情況下指定這些值

$ cmake ../src \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/path/to/android-toolchain

使用 NVIDIA Nsight Tegra Visual Studio Edition 為 Android 進行交叉編譯

一個用於配置其中一個 Visual Studio 產生器 以使用 NVIDIA Nsight Tegra 針對 Android 進行建置的工具鏈檔案,看起來可能像這樣

set(CMAKE_SYSTEM_NAME Android)

可以設定 CMAKE_GENERATOR_TOOLSET 來選擇 Nsight Tegra 的「工具鏈版本」值。

另請參閱目標屬性

為 iOS、tvOS、visionOS 或 watchOS 進行交叉編譯

對於交叉編譯到 iOS、tvOS、visionOS 或 watchOS,建議使用 Xcode 產生器。也可以使用 Unix MakefilesNinja 產生器,但它們需要專案處理更多方面,例如目標 CPU 選擇和程式碼簽署。

可以透過將 CMAKE_SYSTEM_NAME 變數設定為下表中其中一個值來指定任何 Apple 裝置平台。預設情況下,會選擇最新的裝置 SDK。至於所有 Apple 平台,可以透過設定 CMAKE_OSX_SYSROOT 變數來選擇不同的 SDK(例如模擬器),儘管這很少有必要(請參閱下方的在裝置和模擬器之間切換)。可以透過執行 xcodebuild -showsdks 來取得可用的 SDK 清單。

作業系統

CMAKE_SYSTEM_NAME

裝置 SDK(預設)

模擬器 SDK

Catalyst SDK

iOS

iOS

iphoneos

iphonesimulator

macosx

tvOS

tvOS

appletvos

appletvsimulator

不適用

visionOS

visionOS

xros

xrsimulator

不適用

watchOS

watchOS

watchos

watchsimulator

不適用

例如,若要為 iOS 建立 CMake 設定,下列命令就足夠了

cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS

變數 CMAKE_OSX_ARCHITECTURES 可用於設定裝置和模擬器的架構。變數 CMAKE_OSX_DEPLOYMENT_TARGET 可用於設定 iOS/tvOS/visionOS/watchOS 的部署目標。

下一個範例會在 iOS 程式庫的通用二進位檔中安裝五個架構。它會視情況加入相關的 -miphoneos-version-min=9.3-mios-simulator-version-min=9.3 編譯器旗標。請注意,範例中使用的 CMAKE_IOS_INSTALL_COMBINED 變數現在已棄用,因此不再建議使用此方法。

$ cmake -S. -B_builds -GXcode \
    -DCMAKE_SYSTEM_NAME=iOS \
    "-DCMAKE_OSX_ARCHITECTURES=armv7;armv7s;arm64;i386;x86_64" \
    -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \
    -DCMAKE_INSTALL_PREFIX=`pwd`/_install \
    -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO \
    -DCMAKE_IOS_INSTALL_COMBINED=YES

範例

# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(foo)
add_library(foo foo.cpp)
install(TARGETS foo DESTINATION lib)

安裝

$ cmake --build _builds --config Release --target install

檢查程式庫

$ lipo -info _install/lib/libfoo.a
Architectures in the fat file: _install/lib/libfoo.a are: i386 armv7 armv7s x86_64 arm64
$ otool -l _install/lib/libfoo.a | grep -A2 LC_VERSION_MIN_IPHONEOS
      cmd LC_VERSION_MIN_IPHONEOS
  cmdsize 16
  version 9.3

程式碼簽署

嵌入式 Apple 平台的某些建置成品需要強制程式碼簽署。如果使用 Xcode 產生器,而且需要或想要程式碼簽署,則可以透過 CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM CMake 變數來指定開發團隊 ID。然後,此團隊 ID 將會包含在產生的 Xcode 專案中。預設情況下,CMake 會在內部設定階段(即編譯器 ID 和功能偵測)中避免程式碼簽署的需要。

在裝置與模擬器之間切換

在為任何嵌入式平台配置時,可以選擇以真實裝置或模擬器為目標。兩者都有各自獨立的 SDK,但 CMake 在配置階段僅支援指定單一 SDK。這表示開發人員必須在配置時選擇其中一個。當使用 Xcode 產生器時,這項限制較小,因為即使只為兩者之一執行配置,Xcode 仍然允許您為裝置或模擬器進行建置。在 Xcode IDE 中,建置是針對選定的「目標」平台執行。當從命令列建置時,可以透過傳遞 -sdk 選項給底層的建置工具 (xcodebuild) 來直接指定所需的 SDK。例如:

$ cmake --build ... -- -sdk iphonesimulator

請注意,配置期間執行的檢查是針對配置時的 SDK 進行的,對於其他 SDK 可能不成立。諸如 find_package()find_library() 等命令,僅儲存和使用已配置的 SDK/平台的詳細資訊,因此如果想要在裝置和模擬器建置之間切換,可能會出現問題。您可以遵循以下規則,使裝置 + 模擬器配置正常運作:

  • 使用明確的 -l 連結器旗標,例如: target_link_libraries(foo PUBLIC "-lz")

  • 使用明確的 -framework 連結器旗標,例如: target_link_libraries(foo PUBLIC "-framework CoreFoundation")

  • 僅針對使用 CMAKE_IOS_INSTALL_COMBINED 功能安裝的程式庫使用 find_package()