CMake 入门实战
https://www.hahack.com/codes/cmake/#
五、记录问题
5.1 cmake 交叉编译相关变量
在CMake中,进行交叉编译时,有几个关键的变量用于控制编译器、链接器以及其他工具的选择,以及目标平台的特性。以下是一些常见的CMake变量,它们在交叉编译环境中特别重要:
-
CMAKE_TOOLCHAIN_FILE
- 这个变量用于指定一个工具链文件,该文件定义了交叉编译环境的特定设置,如编译器路径、目标平台的特性等。
-
CMAKE_SYSTEM_NAME
- 定义目标系统名称,如
Linux
、Darwin
、Windows
等,用于让CMake知道目标平台是什么。
- 定义目标系统名称,如
-
CMAKE_SYSTEM_VERSION
- 目标系统的版本,用于更精确地识别目标平台。
-
CMAKE_SYSTEM_PROCESSOR
- 目标处理器架构,如
arm
、x86_64
等。
- 目标处理器架构,如
-
CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER
- 分别指定C和C++编译器的完整路径。在交叉编译环境中,这通常是目标平台的编译器,如
arm-linux-gnueabihf-gcc
。
- 分别指定C和C++编译器的完整路径。在交叉编译环境中,这通常是目标平台的编译器,如
-
CMAKE_FIND_ROOT_PATH
- 指定查找库和头文件的根目录,通常是目标系统的根文件系统。
-
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM
- 控制在
CMAKE_FIND_ROOT_PATH
中查找可执行文件的方式。默认是BOTH
,即在CMAKE_FIND_ROOT_PATH
和宿主机系统中查找。
- 控制在
-
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
- 类似上面,但针对库文件。
-
CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
- 类似上面,但针对包配置文件。
-
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
- 类似上面,但针对头文件。
-
CMAKE_EXE_LINKER_FLAGS 和 CMAKE_MODULE_LINKER_FLAGS 和 CMAKE_SHARED_LINKER_FLAGS
- 这些变量允许你传递额外的链接器标志给编译过程,可能需要在交叉编译时进行特殊配置。
-
CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS
- 允许你向C和C++编译器传递额外的编译标志。
-
CMAKE_AR
- 指定归档工具的路径,对于交叉编译很重要。
-
CMAKE_RANLIB
- 指定ranlib工具的路径,用于更新归档文件的索引。
-
CMAKE_STRIP
- 指定strip工具的路径,用于从可执行文件和库中移除符号表和调试信息。
-
CMAKE_TRY_COMPILE_TARGET_TYPE
- 指定CMake尝试编译的目标类型,用于在目标平台上测试编译器的特性。
在设置这些变量时,通常需要在CMakeLists.txt文件的顶部进行配置,或者在调用cmake
命令行工具时通过-D
参数来指定。例如:
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake \
-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
-DCMAKE_FIND_ROOT_PATH=path/to/cross/sysroot \
path/to/source
使用这些变量,你可以有效地控制CMake的交叉编译流程,确保生成的二进制文件适用于目标平台。
5.2 cmake -C toolchain.cmake 和 -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
cmake .. -C toolchain.cmake
和
cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
两个区别
cmake .. -C toolchain.cmake
和 cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
这两种用法都与 CMake 的工具链文件相关,但它们之间有一个关键的区别:
-
使用
-C
选项:-C
选项用于指定一个 CMake 脚本文件,该文件中的设置将被应用在 CMake 命令执行之前。- 这通常用于指定一个预配置的 CMake 缓存,或者一个包含设置 CMake 变量的脚本。
- 当使用
-C
选项时,指定的文件会被执行,其内容(如set()
命令)会影响 CMake 配置过程。
-
使用
-DCMAKE_TOOLCHAIN_FILE
选项:-DCMAKE_TOOLCHAIN_FILE
是一个 CMake 命令行变量,用于指定包含工具链信息的文件。- 这个选项告诉 CMake 在执行过程中加载并包含指定的工具链文件。
- 工具链文件通常包含交叉编译相关的设置,如编译器路径、系统名称、处理器架构等。
在实际使用中,如果您的 toolchain.cmake
文件仅用于设置工具链相关的变量,那么两种方法都可以达到相同的目的。但是,如果您的文件中包含更复杂的逻辑,或者您想要在 CMake 配置过程之前执行一些特定的命令,使用 -C
选项可能更合适。
此外,-C
选项可以用于覆盖 CMake 缓存中的变量,而 -DCMAKE_TOOLCHAIN_FILE
仅用于指定工具链文件路径。如果使用 -C
选项,CMake 会忽略已有的缓存,并重新运行配置步骤。
总结来说,选择哪种方法取决于您的具体需求和 toolchain.cmake
文件的内容。如果文件仅用于工具链配置,两者可以互换使用;如果需要执行更复杂的预配置逻辑,使用 -C
选项可能更合适。