cmake交叉编译的使用(代码片段)

show-hand show-hand     2023-05-04     289

关键词:

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 )

make/cmake:海思himix200交叉编译zlib(代码片段)

因为zlib没有任何依赖库,而且代码很成熟,交叉编译还是比较简单的.编译环境Ubuntu16.04x86_64himix2000编译工具链下载openssl源码wgethttp://zlib.net/fossils/zlib-1.2.9.tar.gz解压源码tarxvfzlib-1.2.9.tar.gzCMAKE编译如果你有安装cmake,可以使用cmake来完... 查看详情

cmake交叉编译示例(代码片段)

...文通过一个简单的示例,演示如何在CMake工程中添加交叉编译的配置,实现编译不同硬件平台的可执行文件。所有代码均可在getiot/linux-c仓库找到。搭建工程hello.c文件#include<stdio.h>intmain(void)printf("Hello,GetIoT\\n");re... 查看详情

cmake交叉编译示例(代码片段)

...文通过一个简单的示例,演示如何在CMake工程中添加交叉编译的配置,实现编译不同硬件平台的可执行文件。所有代码均可在getiot/linux-c仓库找到。搭建工程hello.c文件#include<stdio.h>intmain(void)printf("Hello,GetIoT\\n");re... 查看详情

cmake:arm-xm-linux交叉编译工具链文件及交叉支持https的curl静态库(代码片段)

curl是一个成熟的HTTPclient库,可以使用cmake在命令行完成交叉编译。TOOLCHAIN首先要准备工具链文件arm-xm-linux-uclibcgnueabi.toolchain.cmake#ThisoneisimportantSET(CMAKE_SYSTEM_NAMELinux)SET(CMAKE_SYSTEM_PROCESSORarm)#_compiler_pre 查看详情

cmake交叉编译android库(代码片段)

CMAKE交叉编译Android库不管是在Windows,还是Ubuntu平台,cmake-G"UnixMakefiles"-DCMAKE_TOOLCHAIN_FILE=F:/Download/android-ndk-r21-windows-x86_64/android-ndk-r21/build/cmake/android.toolchain. 查看详情

cmake交叉编译android库(代码片段)

CMAKE交叉编译Android库不管是在Windows,还是Ubuntu平台,cmake-G"UnixMakefiles"-DCMAKE_TOOLCHAIN_FILE=F:/Download/android-ndk-r21-windows-x86_64/android-ndk-r21/build/cmake/android.toolchain. 查看详情

cmake:esp32交叉编译工具链定义(代码片段)

ESP32的SDK(ESP-IDF)本身提供了esp32平台的cmaketoolchain文件:esp-idf-v4.4\\tools\\cmake\\toolchain-esp32.cmake1就是esp32的工具链文件定义样板。如下:set(CMAKE_SYSTEM_NAMEGeneric)set(CMAKE_C_COMPILERxtensa-esp32-elf-gcc)set( 查看详情

为arm64交叉编译googletest(代码片段)

...googletest使用cmake。我尝试使用以下cmake脚本来表明我想要交叉编译谷歌测试。$cattoolchain-arm64.cmakeset(CMAKE_SYSTEM_NAMELinux)set(CMAKE_CROSSCOMPILINGTRUE)set(CMAKE_CXX_COMPILER/home/asdf/repos/toolchains/gcc-linaro-6.1.1-2016.08-x86_64_aarch64-linux-gnu/bin/aarch64-linux-... 查看详情

cmake交叉编译示例(代码片段)

...文通过一个简单的示例,演示如何在CMake工程中添加交叉编译的配置,实现编译不同硬件平台的可执行文件。所有代码均可在getiot/linux-c仓库找到。搭建工程hello.c文件#include<stdio.h>intmain(void)printf("Hello,GetIoT\\n");re... 查看详情

2交叉编译mosquitto(代码片段)

...SourceryG++Lite2009q3-67)cmake3.5.1参考博客2、基础认识mosquitto在交叉编译的时候,一般需要用到几个比较重要的动态库libssl.so,libcrypto.so,libuuid的库;在运行时需要openssl(libssl.so、libcrypto.so)、c-areas、mosquitto编译后的库。所以,在编... 查看详情

交叉编译错误isnotabletocompileasimpletestprogram(代码片段)

交叉编译出现错误:CMakeErrorat/home/sph/.local/lib/python2.7/site-packages/cmake/data/share/cmake-3.18/Modules/CMakeTestCCompiler.cmake:66(message):TheCcompiler"/opt/cross-toolchain-9.2.0/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-gcc"isnotabl... 查看详情

x86平台代码移植到嵌入式平台[交叉编译三方库](代码片段)

...库写cmake管理现有工程,确认cmake可以用2找到嵌入式平台交叉编译工具链拷贝到Ubuntu系统的路径下,这里将工具链文件夹拷贝到/opt/tools目录并将该路径导出到环境变量vim 查看详情

cmake交叉编译android库(代码片段)

CMAKE交叉编译Android库不管是在Windows,还是Ubuntu平台,cmake-G"UnixMakefiles"-DCMAKE_TOOLCHAIN_FILE=F:/Download/android-ndk-r21-windows-x86_64/android-ndk-r21/build/cmake/android.toolchain.cmake-DANDROID_NDK=F:/Download/android-ndk-r21-windows-x86_64/android-... 查看详情

[tools][cmake]调试笔记---cmake缓存引起的一个错误(代码片段)

背景:修改cmake交叉编译环境的时候本来想配置CMAKE_TOOLCHAIN_FILE来改变编译工具和环境,但是编译器报了句warningManually-specifiedvariableswerenotusedbytheproject,然后交叉环境没配置成功。原因:我有修改了对应的CMakeLists.txt,但... 查看详情

gtest嵌入式平台编译(代码片段)

Gtest嵌入式平台编译下载源码gitclonegit@github.com:google/googletest.git编译cdgoogletest#新建cmake构建目录mkdirbuildcdbuild#cmake构建cmake..#编译make嵌入式交叉编译编辑交叉编译工具链的cmake文件cdgoogletestvitoolchain-arm-linux-gnueabihf.cma 查看详情

gtest嵌入式平台编译(代码片段)

Gtest嵌入式平台编译下载源码gitclonegit@github.com:google/googletest.git编译cdgoogletest#新建cmake构建目录mkdirbuildcdbuild#cmake构建cmake..#编译make嵌入式交叉编译编辑交叉编译工具链的cmake文件cdgoogletestvitoolchain-arm-linux-gnueabihf.cma 查看详情

cmake_toolchain_file(代码片段)

CMAKE_TOOLCHAIN_FILECMAKE给交叉编译预留了一个变量CMAKE_TOOLCHAIN_FILE,它定义了一个.cmake文件的路径,该文件里面设置了一系列CMAKE变量和属性,比如C_COMPILER,CXX_COMPILER等。.cmake文件的好处是一次编写多次使用,不同平台架构的交叉编... 查看详情

CMake交叉编译目标rpath

】CMake交叉编译目标rpath【英文标题】:CMakecrosscompiletargetrpath【发布时间】:2015-08-0416:37:34【问题描述】:我正在使用CMake进行交叉编译。在我的CMakeLists.txt中(用于编译和交叉编译):set(CMAKE_INSTALL_RPATH_USE_LINK_PATHTRUE)find_package(fo... 查看详情