不少時候,咱們在開發的時候是面對嵌入式平臺,所以因爲資源的限制須要用到相關的交叉編譯。即在你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的全部交叉環境的設置。ui
這裏面也牽扯了一些相關的變量設置,在這裏簡單介紹下幾個比較重要的this
1.CMAKE_SYSTEM_NAME: 即你目標機target所在的操做系統名稱,好比ARM或者Linux你就須要寫"Linux",若是Windows平臺你就寫"Windows",若是你的嵌入式平臺沒有相關OS你即須要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變量被設置了,CMake才認爲此時正在交叉編譯,它會額外設置一個變量CMAKE_CROSSCOMPILING爲TRUE.spa
2. CMAKE_C_COMPILER: 顧名思義,即C語言編譯器,這裏能夠將變量設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其餘工具好比linker,binutils等,若是你寫的文件名帶有arm-elf等等前綴,CMake會識別到而且去尋找相關的交叉編譯器。操作系統
3. CMAKE_CXX_COMPILER: 同上,此時表明的是C++編譯器。code
4. CMAKE_FIND_ROOT_PATH: 表明了一系列的相關文件夾路徑的根路徑的變動,好比你設置了/opt/arm/,全部的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,而後纔會去你本身的/usr/lib和/lib進行查找,若是你有一些庫是不被包含在/opt/arm裏面的,你也能夠顯示指定多個值給CMAKE_FIND_ROOT_PATH,好比blog
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下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變量來講,通常都是調用宿主機的程序,因此通常都設置成NEVERci
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