基于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 取值

猜你喜欢

转载自www.cnblogs.com/alix-1988/p/12173367.html