CMake交叉編譯配置

很多時候,我們在開發的時候是面對嵌入式平臺,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裏面牽扯到相關頭文件的切換和編譯器的選擇以及環境變量的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些準備工作。

    CMake給交叉編譯預留了一個很好的變量即CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裏面set了一系列你需要改變的變量和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裏面指定的路徑)。CMake爲了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。

    這裏面也牽扯了一些相關的變量設置,在這裏簡單介紹下幾個比較重要的

    1.CMAKE_SYSTEM_NAME: 即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平臺你就寫"Windows",如果你的嵌入式平臺沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變量被設置了,CMake才認爲此時正在交叉編譯,它會額外設置一個變量CMAKE_CROSSCOMPILING爲TRUE.

    2. CMAKE_C_COMPILER: 顧名思義,即C語言編譯器,這裏可以將變量設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。

    3. CMAKE_CXX_COMPILER: 同上,此時代表的是C++編譯器。

    4. CMAKE_FIND_ROOT_PATH: 代表了一系列的相關文件夾路徑的根路徑的變更,比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後纔會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裏面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如

set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)

    5.  CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: 對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變量來說,一般都是調用宿主機的程序,所以一般都設置成NEVER

    6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: 對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這裏需要設置成ONLY來保證我們的庫是在交叉環境中找的.

    7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: 對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH

    8. BOOST_ROOT: 對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這裏的路徑即ARM下的boost路徑,裏面有include和lib。

    9. QT_QMAKE_EXECUTABLE: 對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這裏需要指定成相應的qmake路徑(指定到qmake本身)

 

下面貼上相關demo,讓同學可以更清晰的看到相應配置。

複製代碼
# this is required
SET(CMAKE_SYSTEM_NAME Linux)

# specify the cross compiler
SET(CMAKE_C_COMPILER   /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)

# where is the target environment 
SET(CMAKE_FIND_ROOT_PATH  /opt/arm/ppc_74xx /home/rickk/arm_inst)

# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
複製代碼

這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平臺是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。

    CMake交叉編譯配置就介紹到這,轉移之間我來博客園也2個多月了,感受頗多,希望你會喜歡這篇文章 : ) 並且給我一點鼓勵。

 

參考鏈接: http://www.cmake.org/Wiki/CMake_Cross_Compiling

發佈了17 篇原創文章 · 獲贊 19 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章