cmake-工具鏈(7)

介紹

CMake 使用一系列工具鏈實用程式來編譯、連結程式庫、建立靜態庫以及執行其他建置任務。可用的工具鏈實用程式取決於所啟用的語言。在一般建置中,CMake 會根據系統內省和默認值自動決定主機建置的工具鏈。在交叉編譯情境中,可以指定一個工具鏈檔案,其中包含編譯器和實用程式的路徑資訊。

在 3.19 版被加入: 可以使用 cmake-presets(7) 來指定工具鏈檔案。

語言

語言是透過 project() 命令啟用的。語言特定的內建變數,例如 CMAKE_CXX_COMPILERCMAKE_CXX_COMPILER_ID 等,是透過呼叫 project() 命令來設定的。如果最上層的 CMakeLists 檔案中沒有 project 命令,將會隱含地生成一個。默認情況下,啟用的語言是 CCXX

project(C_Only C)

A special value of NONE can also be used with the project() command to enable no languages:

project(MyProject NONE)

The enable_language() command can be used to enable languages after the project() command:

enable_language(CXX)

When a language is enabled, CMake finds a compiler for that language, and determines some information, such as the vendor and version of the compiler, the target architecture and bitwidth, the location of corresponding utilities etc.

The ENABLED_LANGUAGES global property contains the languages which are currently enabled.

變數與屬性

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

CMAKE_<LANG>_COMPILER

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

CMAKE_<LANG>_COMPILER_ID

CMake 使用的編譯器識別碼

CMAKE_<LANG>_COMPILER_VERSION

編譯器的版本。

CMAKE_<LANG>_FLAGS

這些變數及其特定組態的對應項包含了會新增到特定語言所有編譯器呼叫的旗標,包括驅動編譯和連結的呼叫。

CMAKE_<LANG>_LINK_FLAGS

在 4.3 版被加入.

這些變數及其特定組態的對應項包含了會新增到特定語言僅驅動連結時的所有編譯器呼叫的旗標。

CMake 需要一種方法來確定使用哪個編譯器來呼叫連結器。這是由 target 原始檔案的 LANGUAGE 屬性決定的,而在靜態庫的情況下,則由依賴程式庫的 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 條目中進行查詢,同時也會在主機系統根前綴中進行查詢。雖然可以逐案控制此行為,但在交叉編譯時,排除在主機或目標中查詢特定工件可能很有用。通常,標頭檔、程式庫和套件應在目標系統前綴中尋找,而必須在建置期間執行的可執行檔應僅在主機上尋找,而不是在目標上尋找。這就是 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_SYSTEM_NAME 的情況下執行 CMake 將在主機模式下執行組態步驟,假設為標準 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_ntoaarch64)

set(CMAKE_C_COMPILER qcc)
set(CMAKE_C_COMPILER_TARGET ${arch})
set(CMAKE_CXX_COMPILER q++)
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 按照 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 變數的文件說明選擇 Windows SDK。

為 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- 前綴)來設定 ADSP SHARC 或 Blackfin 的交叉編譯組態,例如 21594SC589 等。此值不區分大小寫。

CMake 會自動在其默認安裝位置搜尋 CCES 或 VDSP++ 安裝,並選擇找到的最新版本。如果同時安裝了兩者,CCES 將優先於 VDSP++ 被選中。自訂安裝路徑可以透過 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 或獨立工具鏈。

在 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 的「Toolchain Version」值。

另請參見目標屬性:

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

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

任何 Apple 裝置平台都可以透過將 CMAKE_SYSTEM_NAME 變數設定為下表中的值來作為目標。默認情況下,會選擇最新的 Device 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

代碼簽署

如果在使用 Xcode 生成器時需要或希望進行代碼簽署,可以透過 CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM CMake 變數指定開發團隊 ID。此團隊 ID 將被包含在生成的 Xcode 專案中。默認情況下,CMake 在內部組態階段(即編譯器 ID 和功能偵測)避免需要代碼簽署。

在裝置和仿真器之間切換

在為任何嵌入式平台進行組態時,您可以選擇以真實裝置或仿真器為目標。兩者都有各自獨立的 SDK,但 CMake 僅支援在組態階段指定單一 SDK。這意味著開發人員必須在組態時選擇其中一個。使用 Xcode 生成器時,這個限制較小,因為即使只針對其中一個進行了組態,Xcode 仍然允許您為裝置或仿真器進行建置。在 Xcode IDE 中,系統會針對所選的「目標平台」執行建置。從命令行建置時,可以透過向底層建置工具 (xcodebuild) 傳遞 -sdk 選項來直接指定所需的 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()

為 Emscripten 進行交叉編譯

在 4.2 版被加入.

工具鏈檔案可以透過將 CMAKE_SYSTEM_NAME 變數設定為 Emscripten 來設定 Emscripten 的交叉編譯組態。例如,工具鏈檔案可能包含:

set(CMAKE_SYSTEM_NAME Emscripten)
set(CMAKE_C_COMPILER /path/to/emcc)
set(CMAKE_CXX_COMPILER /path/to/em++)

使用 Renesas 編譯器進行交叉編譯

對於使用 Renesas 編譯器進行交叉編譯,至少需指定:

CMAKE_SYSTEM_NAME

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

CMAKE_C_COMPILER

設定為 Renesas C 編譯器的路徑,例如 ccrxccrlccrh

CMAKE_C_FLAGS

設定為編譯器所需的 -isa=-cpu= 旗標。

請參見以下小節中的工具鏈檔案範例。

Renesas CC-RX

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "ccrx.exe")
set(CMAKE_ASM_COMPILER "ccrx.exe") # 如果使用 ASM 語言
set(CMAKE_C_FLAGS "-isa=rxv3") # 指定目標 RX CPU 的版本
set(CMAKE_EXE_LINKER_FLAGS "-lnkopt=<您的連結器選項>")

Renesas CC-RL

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "ccrl.exe")
set(CMAKE_ASM_COMPILER "ccrl.exe") # 如果使用 ASM 語言
set(CMAKE_C_FLAGS "-cpu=S3") # 指定目標 RL CPU 的版本
# 為避免測試可執行檔超出 const 區段的大小。
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 透過編譯器驅動程式指定裝置檔案和區段配置連結器選項。
set(CMAKE_EXE_LINKER_FLAGS "-lnkopt=-device=dr5f10y14.dvf -lnkopt=-auto_section_layout")

Renesas CC-RH

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "ccrh.exe")
set(CMAKE_ASM_COMPILER "ccrh.exe") # 如果使用 ASM 語言
set(CMAKE_C_FLAGS "-Xcommon=rh850") # 指定目標 RH850 CPU 的版本
set(CMAKE_EXE_LINKER_FLAGS "-lnkopt=<your linker option here>")