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