博客專欄

        EEPW首頁 > 博客 > CMake交叉編譯配置

        CMake交叉編譯配置

        發布人:電子禪石 時間:2022-11-24 來源:工程師 發布文章

          很多時候,我們在開發的時候是面對嵌入式平臺,因此由于資源的限制需要用到相關的交叉編譯。即在你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)


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: cmake

        技術專區

        關閉
        主站蜘蛛池模板: 开阳县| 兴和县| 琼结县| 河间市| 保康县| 石楼县| 会昌县| 离岛区| 崇义县| 济阳县| 外汇| 崇文区| 西乌珠穆沁旗| 六枝特区| 祁门县| 济阳县| 斗六市| 昭觉县| 郑州市| 丰镇市| 宁南县| 新巴尔虎左旗| 拉萨市| 信阳市| 沽源县| 蓬安县| 木兰县| 赫章县| 禄丰县| 门源| 宁海县| 蕲春县| 玛多县| 安泽县| 缙云县| 诏安县| 岳西县| 龙口市| 绍兴市| 繁昌县| 调兵山市|