博客專欄

EEPW首頁(yè) > 博客 > CMake交叉編譯配置

CMake交叉編譯配置

發(fā)布人:電子禪石 時(shí)間:2022-11-24 來(lái)源:工程師 發(fā)布文章

  很多時(shí)候,我們?cè)陂_發(fā)的時(shí)候是面對(duì)嵌入式平臺(tái),因此由于資源的限制需要用到相關(guān)的交叉編譯。即在你host宿主機(jī)上要生成target目標(biāo)機(jī)的程序。里面牽扯到相關(guān)頭文件的切換和編譯器的選擇以及環(huán)境變量的改變等,我今天僅僅簡(jiǎn)單介紹下相關(guān)CMake在面對(duì)交叉編譯的時(shí)候,需要做的一些準(zhǔn)備工作。

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

    這里面也牽扯了一些相關(guān)的變量設(shè)置,在這里簡(jiǎn)單介紹下幾個(gè)比較重要的

    1.CMAKE_SYSTEM_NAME: 即你目標(biāo)機(jī)target所在的操作系統(tǒng)名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平臺(tái)你就寫"Windows",如果你的嵌入式平臺(tái)沒(méi)有相關(guān)OS你即需要寫成"Generic",只有當(dāng)CMAKE_SYSTEM_NAME這個(gè)變量被設(shè)置了,CMake才認(rèn)為此時(shí)正在交叉編譯,它會(huì)額外設(shè)置一個(gè)變量CMAKE_CROSSCOMPILING為TRUE.

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

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

    4. CMAKE_FIND_ROOT_PATH: 代表了一系列的相關(guān)文件夾路徑的根路徑的變更,比如你設(shè)置了/opt/arm/,所有的Find_xxx.cmake都會(huì)優(yōu)先根據(jù)這個(gè)路徑下的/usr/lib,/lib等進(jìn)行查找,然后才會(huì)去你自己的/usr/lib和/lib進(jìn)行查找,如果你有一些庫(kù)是不被包含在/opt/arm里面的,你也可以顯示指定多個(gè)值給CMAKE_FIND_ROOT_PATH,比如

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

    5.  CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: 對(duì)FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個(gè)表示不在你CMAKE_FIND_ROOT_PATH下進(jìn)行查找,第二個(gè)表示只在這個(gè)路徑下查找,第三個(gè)表示先查找這個(gè)路徑,再查找全局路徑,對(duì)于這個(gè)變量來(lái)說(shuō),一般都是調(diào)用宿主機(jī)的程序,所以一般都設(shè)置成NEVER

    6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: 對(duì)FIND_LIBRARY()起作用,表示在鏈接的時(shí)候的庫(kù)的相關(guān)選項(xiàng),因此這里需要設(shè)置成ONLY來(lái)保證我們的庫(kù)是在交叉環(huán)境中找的.

    7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: 對(duì)FIND_PATH()和FIND_FILE()起作用,一般來(lái)說(shuō)也是ONLY,如果你想改變,一般也是在相關(guān)的FIND命令中增加option來(lái)改變局部設(shè)置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH

    8. BOOST_ROOT: 對(duì)于需要boost庫(kù)的用戶來(lái)說(shuō),相關(guān)的boost庫(kù)路徑配置也需要設(shè)置,因此這里的路徑即ARM下的boost路徑,里面有include和lib。

    9. QT_QMAKE_EXECUTABLE: 對(duì)于Qt用戶來(lái)說(shuō),需要更改相關(guān)的qmake命令切換成嵌入式版本,因此這里需要指定成相應(yīng)的qmake路徑(指定到qmake本身)

 

下面貼上相關(guān)demo,讓同學(xué)可以更清晰的看到相應(yīng)配置。

# 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)


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: cmake

技術(shù)專區(qū)

關(guān)閉