基于cmake的交叉编译工具链
基于cmake的交叉编译工具链
一、基本概念 1. 什么是交叉编译
交叉编译是A机器上编译生成,运行在B机器上。两个机子有不同的机器指令。
2. 什么是宿主机和目标机
宿主机(host)是指使用交叉编译工具链执行编译的主机,一般配置较高,如PC主机;目标机(target)是指运行交叉编译出的可执行程序的机器,一般资源有限,如嵌入式开发板。
3. 什么是工具链
工具链一般是由编译器、连接器、解释器和调试器组成,同时也包括目标机器的头文件、库文件等编译资源。
4. cmake 工具链变量
二、编译流程
三、编译方法 1. cmake 命令行编译
命令
# 通过 CMAKE_TOOLCHIAIN_FILE 指定交叉编译工具链文件 cmake -D CMAKE_TOOLCHIAIN_FILE="/path/to/my-cmake-toolchain-file.cmake" ..
交叉编译工具链文件为一个后缀为.cmake文件的cmake文件。
2. 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
指定交叉编译时可执行程序的搜索模式
一般取值 NEVER 或 ONLY
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 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)
2、简单示例
文件结构
文件内容
toolchain.cmake
CMakeLists.txt
main.cpp
编译方法
命令行编译
图形界面编译
六、参考链接
交叉工具链
CMake交叉编译
CMAKE_SYSTEM_NAME 取值