Trantor
  • Introduction
  • Pinctrl Subsystem 与 GPIO Subsystem的交互
  • ION Memory Control
  • Gitbook-Cli Tutorial
  • Linux命令行解析函数getopt_long()
  • CMake in Action
    • CMake Tutorial
      • 使用CMake构建库
      • 查找已有库
      • CMake install
      • 交叉编译
      • SUMMARY
    • CMake Example
    • 如何建立自己的PackageConfig.cmake
    • CMake自定义内容
    • CPACK生成deb安装包
  • MQTT 3.1.1
    • Paho MQTT C Client Library Example
  • Loading shared library APIs dynamically
  • C++ Thread Pool
  • Linux平台下的动态链接库
  • C++种的动态内存分配:new和delete
  • C++ STL std::list探索
  • HTTP POST form-data return '400: Data Error.'
Powered by GitBook
On this page

Was this helpful?

  1. CMake in Action
  2. CMake Tutorial

交叉编译

A simple example of building cross-platform project with CMake.

PreviousCMake installNextSUMMARY

Last updated 3 years ago

Was this helpful?

作为一个嵌入式应用工程师,大部分程序都运行在目标设备上,虽然有各类SSH工具可以让开发者远程访问到开发板上进行快速开发,但交叉编译也是不可避免的一部分。给出了一个简单的例子,例子以树莓派为目标设备完成交叉编译链的配置,以下内容为补充说明。

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的标识符,表明目标设备的CPU架构

  • CMAKE_SYSROOT:可选项,目标设备系统的根目录(系统源码?)

  • CMAKE_STAGING_PREFIX:可选项,可能被用来指定项目在编译主机上的安装目录。和CMAKE_INSTALL_PREFIX不同,即使在交叉编译时,CMAKE_INSTALL_PREFIX始终是运行时安装路径。

    查到的一种解释是:

    • 当CMAKE_STAGING_PREFIX和CMAKE_INSTALL_PREFIX都设置了的时候,CMAKE_STAGING_PREFIX将覆盖CMAKE_INSTALL_PREFIX以免重置地址。

    • 开发者使用CMAKE_STAGING_PREFIX作为路径前缀将项目安装到host设备之后再使用其他方式将文件传入target设备中。

  • CMAKE_C_COMPILER:目标设备的C编译器路径

  • CMAKE_CXX_COMPILER:目标设备的C++编译器路径

  • CMAKE_FIND_ROOT_PATH:CMake使用这个列表中的路径替代默认路径来查找包,库,头文件

  • CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:对应find_program,寻找可执行程序。通常而言调用可执行程序都是调用编译主机上的可执行程序,因此不需要从CMAKE_FIND_ROOT_PATH去找,一般都设置成NEVER

  • CMAKE_FIND_ROOT_PATH_MODE_LIBRARY、CMAKE_FIND_ROOT_PATH_MODE_INCLUDE、CMAKE_FIND_ROOT_PATH_MODE_PACKAGE由于在进行交叉编译,所以需要使用目标设备平台下的库、头文件和包,因此一般都设置为ONLY

为了方便跨平台构建编译,通常会将上述交叉编译工具链作为CMake的一个选项,即将对应平台下的交叉编译链分别保存在各自的.cmake配置文件中,CMake提供了一个CMAKE_TOLLCHAIN_FILE变量用于选择对应的目标平台。

例如,将上例指令保存为arm.cmake,在需要交叉编译时运行:

cmake -DCMAKE_TOOLCHAIN_FILE=./arm.cmake -H. -Bbuild
CMake官方文档