基於cmake的交叉編譯工具鏈

1、基本概念

1. 什麼是交叉編譯

交叉編譯是A機器上編譯生成,運行在B機器上。兩個機子有不一樣的機器指令。

2. 什麼是宿主機和目標機

宿主機(host)是指使用交叉編譯工具鏈執行編譯的主機,通常配置較高,如PC主機;目標機(target)是指運行交叉編譯出的可執行程序的機器,通常資源有限,如嵌入式開發板。

3. 什麼是工具鏈

工具鏈通常是由編譯器、鏈接器、解釋器和調試器組成,同時也包括目標機器的頭文件、庫文件等編譯資源。

4. cmake 工具鏈變量

圖片描述

2、編譯流程

圖片描述

3、編譯方法

1. cmake 命令行編譯

  • 命令html

    # 經過 CMAKE_TOOLCHAIN_FILE 指定交叉編譯工具鏈文件
    cmake -D CMAKE_TOOLCHAIN_FILE="/path/to/my-cmake-toolchain-file.cmake" ..
  • 交叉編譯工具鏈文件爲一個後綴爲.cmake文件的cmake文件。

2. cmake-gui 圖形界面編譯

  • cmake-gui 界面
    clipboard.png

4、cmake 工具鏈變量詳解

1. 目標系統變量

CMAKE_SYSTEM_NAME 目標機所在操做系統名稱linux

  • 目標機所在操做系統名稱
  • 不一樣系統取值: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_COMPILERui

  • 目標系統的C++語言編譯器
  • 這裏能夠將變量設置成完整路徑或者文件名

3. 外部依賴庫

CMAKE_FIND_ROOT_PATHspa

  • 表明了目標板使用的一系列相關文件夾路徑的根路徑
  • CMAKE_FIND_ROOT_PATH_MODE_XXX 均在此根路徑及其子目錄下查找

CMAKE_FIND_ROOT_PATH_MODE_PROGRAM操作系統

  • 指定交叉編譯時可執行程序的搜索模式
  • 通常取值 BOTH

CMAKE_FIND_ROOT_PATH_MODE_INCLUDE.net

  • 指定交叉編譯時頭文件的搜索模式
  • 通常取值 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 設置的目錄下進行查找再查找全局路徑

5、應用場景

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 BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

二、簡單示例

  • 文件結構
    clipboard.png
  • 文件內容

    • toolchain.cmake
      clipboard.png
    • CMakeLists.txt
      clipboard.png
    • main.cpp
      clipboard.png
  • 編譯方法

    • 命令行編譯
      clipboard.png
    • 圖形界面編譯
      clipboard.png
      clipboard.png
      clipboard.png
      clipboard.png
      clipboard.png

6、參考連接

相關文章
相關標籤/搜索