基于cmake的交叉编译工具链
本文转载自:https://segmentfault.com/a/1190000019276315,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。
一、基本概念
1. 什么是交叉编译
交叉编译是A机器上编译生成,运行在B机器上。两个机子有不同的机器指令。
2. 什么是宿主机和目标机
宿主机(host)是指使用交叉编译工具链执行编译的主机,一般配置较高,如PC主机;目标机(target)是指运行交叉编译出的可执行程序的机器,一般资源有限,如嵌入式开发板。
3. 什么是工具链
工具链一般是由编译器、连接器、解释器和调试器组成,同时也包括目标机器的头文件、库文件等编译资源。
4. cmake 工具链变量
二、编译流程
三、编译方法
1. cmake 命令行编译
-
命令
# 通过 CMAKE_TOOLCHAIN_FILE 指定交叉编译工具链文件 cmake -D CMAKE_TOOLCHAIN_FILE="/path/to/my-cmake-toolchain-file.cmake" ..
- 交叉编译工具链文件为一个后缀为.cmake文件的cmake文件。
2. cmake-gui 图形界面编译
- cmake-gui 界面
四、cmake 工具链变量详解
1. 目标系统变量
CMAKE_SYSTEM_NAME
目标机所在操作系统名称
- 目标机所在操作系统名称
- 不同系统取值:Linux、Android、QNX、WindowsCE、WindowsPhone、WindowsStore(Windows10 or Windows Store)
CMAKE_SYSTEM_PROCESSOR
- 目标系统的硬件或CPU架构
- 不同CPU架构取值:arm(ARM)、x86(X86)
2. 交叉编译器
CMAKE_C_COMPILER
- 目标系统的C语言编译器
- 这里可以将变量设置成完整路径或者文件名
CMAKE_CXX_COMPILER
- 目标系统的C++语言编译器
- 这里可以将变量设置成完整路径或者文件名
3. 外部依赖库
CMAKE_FIND_ROOT_PATH
- 代表了目标板使用的一系列相关文件夹路径的根路径
- CMAKE_FIND_ROOT_PATH_MODE_XXX 均在此根路径及其子目录下查找
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM
- 指定交叉编译时可执行程序的搜索模式
- 一般取值 BOTH
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
- 指定交叉编译时头文件的搜索模式
- 一般取值 ONLY
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
- 指定交叉编译时库文件的搜索模式
- 一般取值 ONLY
CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
- 指定交叉编译时开发包的搜索模式
- 一般取值 ONLY
交叉编译搜索模式
NEVER
表示不在你 CMAKE_FIND_ROOT_PATH 设置的目录下进行查找ONLY
表示仅在你 CMAKE_FIND_ROOT_PATH 设置的目录下进行查找BOTH
表示先在你 CMAKE_FIND_ROOT_PATH 设置的目录下进行查找再查找全局路径
五、应用场景
1. 官方示例
# 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 BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
2、简单示例
- 文件结构
-
文件内容
- toolchain.cmake
- CMakeLists.txt
- main.cpp
- toolchain.cmake
-
编译方法
- 命令行编译
- 图形界面编译
- 命令行编译
六、参考链接
- 交叉工具链
- CMake交叉编译
- CMAKE_SYSTEM_NAME 取值