主機:Ubuntu10.04
交叉編譯器:EABI-4.3.3
CMake在ubuntu系統下預設使用系統的gcc、g++編譯器,編譯arm下的程式要使用arm-linux-gcc,需要對CMake進行設定(通過在CMakeLists.txt中指定交叉編譯器的方法)。
在CMakeLists.txt一開始加入相關設定:
#告知當前使用的是交叉編譯方式,必須配置
SET(CMAKE_SYSTEM_NAME Linux)

#指定C交叉編譯器,必須配置
#或交叉編譯器使用絕對地址
SET(CMAKE_C_COMPILER "arm-linux-gcc")

#指定C++交叉編譯器
SET(CMAKE_CXX_COMPILER "arm-linux-g++")

#不一定需要設定
#指定交叉編譯環境安裝目錄...
SET(CMAKE_FIND_ROOT_PATH "...")
#從來不在指定目錄下查詢工具程式
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目錄下查詢庫檔案
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目錄下查詢標頭檔案
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

二 交叉编译
现在希望最终编译的程序是运行在arm linux系统上的,这就需要交叉编译。

1. 设置系统和工具链
对于交叉编译,CMake并不知道目标系统是什么,所以需要设置一些CMake变量来告知CMake,

CMAKE_SYSTEM_NAME:即目标系统名,这里是Linux
CMAKE_SYSTEM_PROCESSOR :目标系统的处理器名,这里是arm
对于工具链,则是通过下面2个变量来定位,

CMAKE_C_COMPILER:C编译器的可执行文件名称
CMAKE_CXX_COMPILER:C++编译器的可执行文件名称
这些变量可以在调用CMake时通过命令行传递,但是这种做法容易出错,而且用起来不方便,所以CMake提供了工具链文件的方式来传递这些变量信息。

2. 工具链文件
我们在工程里新建一个文件叫arm_linux_setup.cmake,放置位置如下(也可以放在别的地方),

其内容如下,

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)set(tools /home/wh/work/cross_compile/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)



tools是本人使用的交叉工具链路径,可以根据自己的实际文件来做修改。

3. 编译
使用CMake的变量CMAKE_TOOLCHAIN_FILE来指定工具链文件,cd到build目录,然后执行下面的命令,

// 注意,工具链文件的指定一定要紧跟cmake命令之后,不能放到 .. 后面
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake ..
1
2


ok后再执行make,就可以生成main的elf文件,

使用file命令去查看这个文件,可以看到其运行平台是32位ARM处理器上的Linux系统,

使用工具链文件的好处就是只要编写一遍,然后在任意地方只需要使用CMAKE_TOOLCHAIN_FILE去指定其位置就可以了,非常方便。