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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM