我們平常使用CMake時,主要是在x86或x86_64平臺上,其實CMake在2.6版本後就已經支持交叉編譯了,下面就來看下如何使用CMake進行Arm Linux程序的交叉編譯。
一 建立工程
按照如下結構體建立一個簡單工程
main.c內容如下,
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
CMakeLists.txt內容如下,
cmake_minimum_required(VERSION 3.5)
project(demo)
add_executable(main main.c)
這是常規的工程,編譯的話只要cd到build目錄下執行cmake .. && make
就可以了。
二 交叉編譯
現在希望最終編譯的程序是運行在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 ..
ok後再執行make,就可以生成main的elf文件,
使用file命令去查看這個文件,可以看到其運行平臺是32位ARM處理器上的Linux系統,
使用工具鏈文件的好處就是隻要編寫一遍,然後在任意地方只需要使用CMAKE_TOOLCHAIN_FILE去指定其位置就可以了,非常方便。
三 總結
本文主要講述如何使用CMake交叉編譯Arm Linux程序,使用的測試代碼也是很簡單的,與交叉編譯有關的變量還有很多,具體可以參考以下2篇文章,
如果有寫的不對的地方,希望能留言指正,謝謝閱讀。