cmake交叉編譯的使用


2019-12-14     10:51:06

CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。本文主要如何利用cmake實現交叉編譯。在Linux中有在X_86上和ARM上運行的可執行程序。對應的就有不同的編譯方式,X_86上通常都是gcc編譯代碼,ARM上通常都是交叉編譯的方式。下面來介紹cmake在linux交叉編譯的使用。

1、編寫交叉編譯的配置文件

  文件命名為toolchain.cmake,配置文件中主要是對編譯器的說明,指明編譯器的sysroot,CC,CXX以及其他的選項設置,不同的交叉工具鏈配置略有不同,基本配置都是相同的。

 1 #目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變量被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變量
 2 #CMAKE_CROSSCOMPILING為TRUE
 4 #this is required
 5 set(CMAKE_SYSTEM_NAME Linux)
 6 
 7 set(USER_PATH ".....")
 8 
 9 #代表了一系列的相關文件夾路徑的根路徑的變更,編譯器到指定的根目錄下尋找對應的系統庫
10 set(CMAKE_SYSROOT ${USER_PATH}/gcc-eglibc-locale-internal-arm-oe-linux-gnueabi-6.4.0/mdm9607)
11 set(CMAKE_FIND_ROOT_PATH ${USER_PATH}/gcc-eglibc-locale-internal-arm-oe-linux-gnueabi-6.4.0/mdm9607)
12 
13 #指明C和C++編譯器
14 set(tools ${USER_PATH}/gcc-eglibc-locale-internal-arm-oe-linux-gnueabi-6.4.0/x86_64-linux/usr/bin/arm-oe-linux-gnueabi)
15 
16 set(CMAKE_C_COMPILER ${tools}/arm-oe-linux-gnueabi-gcc)
17 set(CMAKE_CXX_COMPILER ${tools}/arm-oe-linux-gnueabi-g++)
18 
19 #有些開源的庫在編譯時需要依賴openssl的庫,指明openssl的庫和頭文件
20 SET(OPENSSL_LIBRARIES ${USER_PATH}/gcc-eglibc-locale-internal-arm-oe-linux-gnueabi-6.4.0/mdm9607/usr/lib)
21 SET(OPENSSL_INCLUDE_DIR ${USER_PATH}/gcc-eglibc-locale-internal-arm-oe-linux-gnueabi-6.4.0/mdm9607/usr/include/openssl)
22 
23 #對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變量來說,一般都是調用宿主機的程序,所以一般都設置成NEVER
24 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
25 
26 #下面的三個選項表示只在交叉環境中查找庫和頭文件
27 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
28 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
29 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

在編譯的時候需要指明配置文件    cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain.cmake ../    CMAKE_TOOLCHAIN_FILE這個指明是使用的配置文件。../ 選擇要編譯的CMakeLists.txt文件。

2、交叉編譯curl代碼

在調用curl的CMakeLists.txt時,需要對CMakeLists.txt配置。這些配置通過上層的CMakeLists.txt傳進去。下面看看上層的庫如何編寫。ADD_SUBDIRECTORY(curl)來調用下面的CMakeLists.txt,通常我們把第三方的庫用外部編譯的方式。

 1 cmake_minimum_required(VERSION 3.10.0)                                  
 2 
 3 #指明頭文件,生成的庫,可執行程序的安裝路徑
 4 set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
 5 set(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}")
 6 set(CMAKE_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}")
 7 set(CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}")
 8 
 9 #做打印調試
10 message(STATUS "-------------------------in curl-------------------")
11 message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}")
12 message(STATUS "CMAKE_INSTALL_BINDIR: ${CMAKE_INSTALL_BINDIR}")
13 message(STATUS "CMAKE_INSTALL_INCLUDEDIR: ${CMAKE_INSTALL_INCLUDEDIR}")
14 message(STATUS "CMAKE_CROSSCOMPILING: ${CMAKE_CROSSCOMPILING}")
15 message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
16 message(STATUS "CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
17 message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
18 message(STATUS "VERBOSE_MESSAGES: ${VERBOSE_MESSAGES}")
19 message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
20 message(STATUS "-------------------------in curl-------------------")
21 #指明外部工程編譯
22 include(ExternalProject)
23 
24 set(CURL_BUILD_DIR ${CMAKE_BINARY_DIR}/source)
25 
26 #對編譯的命令配置
27 if (CMAKE_CROSSCOMPILING)
28 #交叉編譯,在指明交叉編譯時,CMAKE_CROSSCOMPILING被置為TRUE
29 message(STATUS "CURL CMAKE_CROSSCOMPILING: ${CMAKE_CROSSCOMPILING}----------------------------------")
30 set(CMAKE_CONFIGURE_COMMAND
31     cmake
32     -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} 
33     -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} 
34     -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR}
      #指明依賴的openssl的庫路徑
35 -DOPENSSL_ROOT_DIR=${OPENSSL_LIBRARIES} 36 -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES} 37 -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} 38 -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} 39 -DVERBOSE_MESSAGES=${VERBOSE_MESSAGES} 40 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} 41 -DNROFF_USEFUL=0 42 --enable-ftp 43 --enable-tftp 44 -DBUILD_CURL_EXE=0 45 -DENABLE_ARES=0 46 -DUSE_ARES=0 47 -DBUILD_TESTING=0 48 -DENABLE_MANUAL=0 49 -DBUILD_SHARED_LIBS=0 50 -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} 51 ) 52 else () 53 #gcc編譯 54 message(STATUS "CURL GCC: ${CMAKE_CROSSCOMPILING}----------------------------------") 55 set(CMAKE_CONFIGURE_COMMAND 56 cmake 57 -DDAMS_ROOT_DIR=${CMAKE_SOURCE_DIR} 58 -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} 59 -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} 60 -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} 61 -DOPENSSL_ROOT_DIR=/usr/local/ssl 62 -DOPENSSL_LIBRARIES=/usr/local/ssl/lib 63 -DOPENSSL_INCLUDE_DIR=/usr/local/ssl/include 64 -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} 65 -DVERBOSE_MESSAGES=${VERBOSE_MESSAGES} 66 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} 67 -DNROFF_USEFUL=0 68 --enable-ftp 69 --enable-tftp 70 -DBUILD_CURL_EXE=0 71 -DENABLE_ARES=0 72 -DUSE_ARES=0 73 -DBUILD_TESTING=0 74 -DENABLE_MANUAL=0 75 -DBUILD_SHARED_LIBS=0 76 ) 77 endif () 78 79 ExternalProject_Add( 80 CURL 81 PREFIX ${CURL_BUILD_DIR} 82 TMP_DIR curl 83 DOWNLOAD_DIR ${CURL_BUILD_DIR} 84 DOWNLOAD_COMMAND cp -rf ${CMAKE_SOURCE_DIR}/packages/curl/curl-7.64.0 ${CURL_BUILD_DIR} 85 SOURCE_DIR ${CURL_BUILD_DIR}/curl-7.64.0 86 CONFIGURE_COMMAND ${CMAKE_CONFIGURE_COMMAND} ${CURL_BUILD_DIR}/curl-7.64.0 87 BUILD_ALWAYS 1 88 BINARY_DIR ${CURL_BUILD_DIR}/curl-7.64.0 89 BUILD_COMMAND make 90 INSTALL_COMMAND make install 91 LOG_CONFIGURE ${LOG_LEVEL} 92 LOG_BUILD ${LOG_LEVEL} 93 LOG_INSTALL ${LOG_LEVEL} 94 )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM