CMake之交叉編譯

2021-08-04 02:04:16 字數 2397 閱讀 4122

一、引言

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

二、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

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)

Linux之交叉編譯

交叉編譯 在乙個平台上生成另乙個平台的可執行 編譯 是在乙個平台上生成該平台的可執行程式 為什麼要交叉編譯 有的平台上不允許或者不能夠安裝我們所需要的編譯器比如c51。因為目的平台上的資源匱乏,無法執行我們所需要的編譯器。樹莓派是不是就不需要交叉編譯?錯。也要,樹莓派有時又是因為目的平台還沒建立,連...

cmake交叉編譯

1 設定交叉編譯之前,必須在 cmakelist.txt 前面加上這樣一句,這樣 cmake 才會認為你是要交叉編譯 set cmake system namelinux 其中linux 是要編譯過去的平台,如果你是在 linux 下交叉編譯 window 的東西,就要寫成 windows 了。我是...

CMAKE 交叉編譯

步驟需要include open source 的時候,有兩種常見的cross compile 的設定方式 cmake 有公開標準,比較容易自行擴充到不同的平台上 makefile configure all output bin lib 所有要編出來的產物與link方式 有一套cmake語法,與 ...