CMake 入门实战和实践

博客主要围绕CMake展开,介绍了交叉编译时的关键变量,如CMAKE_TOOLCHAIN_FILE、CMAKE_SYSTEM_NAME等,这些变量可控制编译器、链接器等选择及目标平台特性。还对比了cmake -C toolchain.cmake和 -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake两种用法的区别及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMake 入门实战
https://www.hahack.com/codes/cmake/#

五、记录问题

5.1 cmake 交叉编译相关变量

在CMake中,进行交叉编译时,有几个关键的变量用于控制编译器、链接器以及其他工具的选择,以及目标平台的特性。以下是一些常见的CMake变量,它们在交叉编译环境中特别重要:

  1. CMAKE_TOOLCHAIN_FILE

    • 这个变量用于指定一个工具链文件,该文件定义了交叉编译环境的特定设置,如编译器路径、目标平台的特性等。
  2. CMAKE_SYSTEM_NAME

    • 定义目标系统名称,如LinuxDarwinWindows等,用于让CMake知道目标平台是什么。
  3. CMAKE_SYSTEM_VERSION

    • 目标系统的版本,用于更精确地识别目标平台。
  4. CMAKE_SYSTEM_PROCESSOR

    • 目标处理器架构,如armx86_64等。
  5. CMAKE_C_COMPILERCMAKE_CXX_COMPILER

    • 分别指定C和C++编译器的完整路径。在交叉编译环境中,这通常是目标平台的编译器,如arm-linux-gnueabihf-gcc
  6. CMAKE_FIND_ROOT_PATH

    • 指定查找库和头文件的根目录,通常是目标系统的根文件系统。
  7. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM

    • 控制在CMAKE_FIND_ROOT_PATH中查找可执行文件的方式。默认是BOTH,即在CMAKE_FIND_ROOT_PATH和宿主机系统中查找。
  8. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY

    • 类似上面,但针对库文件。
  9. CMAKE_FIND_ROOT_PATH_MODE_PACKAGE

    • 类似上面,但针对包配置文件。
  10. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE

    • 类似上面,但针对头文件。
  11. CMAKE_EXE_LINKER_FLAGSCMAKE_MODULE_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGS

    • 这些变量允许你传递额外的链接器标志给编译过程,可能需要在交叉编译时进行特殊配置。
  12. CMAKE_C_FLAGSCMAKE_CXX_FLAGS

    • 允许你向C和C++编译器传递额外的编译标志。
  13. CMAKE_AR

    • 指定归档工具的路径,对于交叉编译很重要。
  14. CMAKE_RANLIB

    • 指定ranlib工具的路径,用于更新归档文件的索引。
  15. CMAKE_STRIP

    • 指定strip工具的路径,用于从可执行文件和库中移除符号表和调试信息。
  16. 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.cmakecmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake 这两种用法都与 CMake 的工具链文件相关,但它们之间有一个关键的区别:

  1. 使用 -C 选项:

    • -C 选项用于指定一个 CMake 脚本文件,该文件中的设置将被应用在 CMake 命令执行之前。
    • 这通常用于指定一个预配置的 CMake 缓存,或者一个包含设置 CMake 变量的脚本。
    • 当使用 -C 选项时,指定的文件会被执行,其内容(如 set() 命令)会影响 CMake 配置过程。
  2. 使用 -DCMAKE_TOOLCHAIN_FILE 选项:

    • -DCMAKE_TOOLCHAIN_FILE 是一个 CMake 命令行变量,用于指定包含工具链信息的文件。
    • 这个选项告诉 CMake 在执行过程中加载并包含指定的工具链文件。
    • 工具链文件通常包含交叉编译相关的设置,如编译器路径、系统名称、处理器架构等。

在实际使用中,如果您的 toolchain.cmake 文件仅用于设置工具链相关的变量,那么两种方法都可以达到相同的目的。但是,如果您的文件中包含更复杂的逻辑,或者您想要在 CMake 配置过程之前执行一些特定的命令,使用 -C 选项可能更合适。

此外,-C 选项可以用于覆盖 CMake 缓存中的变量,而 -DCMAKE_TOOLCHAIN_FILE 仅用于指定工具链文件路径。如果使用 -C 选项,CMake 会忽略已有的缓存,并重新运行配置步骤。

总结来说,选择哪种方法取决于您的具体需求和 toolchain.cmake 文件的内容。如果文件仅用于工具链配置,两者可以互换使用;如果需要执行更复杂的预配置逻辑,使用 -C 选项可能更合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值