使用CMake交叉編譯Arm Linux程序

我們平常使用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篇文章,

如果有寫的不對的地方,希望能留言指正,謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章