CMake交叉編譯配置

2021-08-11 06:17:07 字數 2551 閱讀 5701

**: 

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

cmake給交叉編譯預留了乙個很好的變數即cmake_toolchain_file,它定義了乙個檔案的路徑,這個檔案即toolchain,裡面set了一系列你需要改變的變數和屬性,包括c_compiler,cxx_compiler,如果用qt的話需要更改qt_qmake_executable以及如果用boost的話需要更改的boost_root(具體檢視相關find***.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++編譯器。

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)

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

CMake交叉編譯配置

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

CMake交叉編譯配置

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

CMake交叉編譯配置

羅列一下cmake常用的命令。cmake支援大寫 小寫 混合大小寫的命令。新增頭檔案目錄include directories 語法 include directories after before system dir1 dir2 它相當於g 選項中的 i引數的作用,也相當於環境變數中增加路徑到c...