cmake-toolchains(7)

簡介

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

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

語言

語言透過 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 目標屬性會添加隱藏可見性的旗標(如果編譯器支援)。

交叉編譯

如果調用 cmake(1) 時使用了命令行參數 --toolchain path/to/file-DCMAKE_TOOLCHAIN_FILE=path/to/file,則會提前載入該檔案以設定編譯器的值。當 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 條目中查找,以及在主機系統根目錄前綴中查找。儘管可以在具體情況下控制這一點,但在交叉編譯時,排除在主機或目標中查找特定工件可能很有用。通常,應在目標系統前綴中找到包含檔、函式庫和套件,而應僅在主機上而不是在目標上找到必須作為建置一部分運行的可執行檔。這就是 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 Store 和 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 Store 交叉編譯

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

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 8.1)

ADSP SHARC/Blackfin 交叉編譯

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

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

編譯器(cc21kccblkfn)會根據提供的 CMAKE_SYSTEM_PROCESSOR 值自動選擇。

Android 交叉編譯

工具鏈檔案可以通過將 CMAKE_SYSTEM_NAME 變數設定為 Android 來配置 Android 的交叉編譯。進一步的配置特定於要使用的 Android 開發環境。

對於 Visual Studio 產生器,CMake 期望安裝 NVIDIA Nsight Tegra Visual Studio EditionVisual Studio tools for Android。有關更多配置詳細資訊,請參閱這些章節。

對於 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 或獨立工具鏈。

Added in version 3.20: 如果選擇了 Android NDK,其版本號將在 CMAKE_ANDROID_NDK_VERSION 變數中報告。(版本 3.20 新增)

使用 NDK 進行 Android 交叉編譯

工具鏈檔案可以配置 Makefile 產生器Ninja 產生器Visual Studio 產生器,以 Android 作為交叉編譯的目標。

配置 Android NDK 的使用,使用以下變數:

CMAKE_SYSTEM_NAME

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

CMAKE_SYSTEM_VERSION

設定為 Android API level。如果未指定,則該值按如下方式確定:

  • 如果設定了 CMAKE_ANDROID_API 變數,則其值將用作 API level。

  • 如果設定了 CMAKE_SYSROOT 變數,則 API level 將從包含 sysroot 的 NDK 目錄結構中檢測到。

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

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 level 的標頭檔,而不是統一標頭檔。如果未指定,預設值將為 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 GeneratorsNinja 產生器,以使用獨立工具鏈為目標 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 level。

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 Generators 其中一個以使用 NVIDIA Nsight Tegra 為目標 Android 進行建置的工具鏈檔案可能如下所示

set(CMAKE_SYSTEM_NAME Android)

可以設定 CMAKE_GENERATOR_TOOLSET 以選擇 Nsight Tegra 的 "Toolchain Version" 值。

另請參閱目標屬性

為 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

N/A

visionOS

visionOS

xros

xrsimulator

N/A

watchOS

watchOS

watchos

watchsimulator

N/A

例如,若要為 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()