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 )

原文地址:https://www.cnblogs.com/show-hand/p/12038568.html

时间: 2024-10-23 06:39:56

cmake交叉编译的使用的相关文章

CMake交叉编译配置

很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译.即在你host宿主机上要生成target目标机的程序.里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等,我今天仅仅简单介绍下相关CMake在面对交叉编译的时候,需要做的一些准备工作.     CMake给交叉编译预留了一个很好的变量即CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括C_COMPILER,CX

CMake交叉编译

在所有CMakelist.txt的最顶部加入如下语句(子目录中也需要加): # 指定交叉编译的目标系统,此处为arm-linux-gnueabihf,依情形设置SET(CMAKE_SYSTEM_NAME arm-linux-gnueabihf) set(triple arm-linux-gnueabihf) # 指定C编译器set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")set(CMAKE_C_COMPILER_TARGE

移植opencv2.4.9到android过程记录

http://blog.csdn.net/brightming/article/details/50606463 在移植到arm开发板的时候已经说过,OpenCV已经为各平台准备了一套cmake交叉编译脚本.为Android移植的脚本在opencv目录/platforms/android/android.toolchain.cmake. 这个脚本里面有很详细的过程介绍,按照它里面的说明,配置好ndk的路径,就可以了. 但我们还需要实现其他目的: 1.使用fpu,neon,且Tag_FP_arch

使用 cmake 进行交叉编译

cmake 因为“又”要额外学一门语言而被诟病,但这并不妨碍越来越多私人项目用 cmake 来管理:autoconfig 确实是更好的发行工具,但 cmake 管理项目确实挺方便.如果要应用这些 cmake 管理的项目到嵌入式环境中,必然涉及交叉编译的问题. 这些项目交叉编译,主要是设置一些环境变量. 这些设定可以写成一个 .cmake 文件,1) 需要交叉编译时 include ,2)或者直接把这些配置写到 CMakeLists.txt 文件的开始位置.两种方法是等效的. 用下面语句应用写好的

cmake指定交叉编译

新建文件arm.cmake,内容如下 #指定嵌入式系统的编译输出目录set(SYSROOT_PATH "/home/suka/out/system") #指定交叉编译器路径set(TOOLSCHAIN_PATH "/home/suka/toolschain/")set(TOOLCHAIN_HOST "${TOOLSCHAIN_PATH}usr/bin/arm-linux") #message("${CMAKE_CURRENT_LIST_

CMake命令:CMake构建系统的骨架

CMake命令:CMake构建系统的骨架 80个命令(转载自http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html#2996205) CMD#1: add_custom_command为生成的构建系统添加一条自定义的构建规则. add_custom_command命令有两种主要的功能:第一种是为了生成输出文件,添加一条自定义命令. add_custom_command(OUTPUT output1 [outpu

easycwmp的交叉编译

原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:[email protected] tel:13657214139 平台: Linux version 2.6.32-279.el6.x86_64 交叉编译器路径:/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux- 开发板:FL2440 开发板运行内核:linux3.0 开发板文件系统:jffs2 一.准备工作 1.创建fl-easycwmp目

windows下使用Cmake和VC 2013安装mongodb C driver

Windows下安装mongodb的C语言程序驱动必须借助交叉编译软件CMake,但是官网上的文档对于一些细节交代的非常不清楚,昨天弄了半天,总算成功安装了,步骤如下: 1.下载mongodb 将mongo-c-driver-1.1.4.zip源代码解压到d:根目录下(此目录路径可根据需要选定). 2.下载libbson库,https://github.com/mongodb/libbson/releases/download/1.1.6/libbson-1.1.6.tar.gz,将其解压.将解

MySQL CMake参数说明手册 【转载】

MySQL CMake参数说明手册 MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,你在安装源文件中找不到configure文件是正常的.很多人下到了新版的MySQL,因为找不到configure文件,不知道该怎么继续下去.有没有一篇可供参考的文章呢?其实在http://forge.mysql.com网站上有一篇文章,专门介绍了如何用CMake工具进行新版MySQL的编译安装. 原文地址为:http://forge.mysql.com/wiki/Autotools_to_CMa