CMake交叉编译配置

很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译。即在你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)# searchfor programs inthe build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#for libraries and headers inthe 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)

这样就完成了相关toolChain的编写,之后,你可以灵活的选择到底采用宿主机版本还是开发机版本,之间的区别仅仅是一条-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做转移,但目标平台是同一个,你仅仅需要写一份toolChain放在一个地方,就可以给所有工程使用。

CMake交叉编译配置就介绍到这,转移之间我来博客园也2个多月了,感受颇多,希望你会喜欢这篇文章 : ) 并且给我一点鼓励。

参考链接: http://www.cmake.org/Wiki/CMake_Cross_Compiling

CMake交叉编译配置相关推荐

  1. linux cmake 交叉编译配置 简介

    很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译.即在你host宿主机上要生成target目标机的程序.里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等 ...

  2. mysql交叉编译 cmake_CMake交叉编译配置

    很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译.即在你host宿主机上要生成target目标机的程序.里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等 ...

  3. Cmake 交叉编译

    转载自 http://zhixinliu.com/2016/02/01/2016-02-01-cmake-cross-compile/ CMake交叉编译 CMake的使用,以及如何将一个项目移植到A ...

  4. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )

    文章目录 I . FFMPEG 交叉编译后的函数库及头文件 II . FFMPEG 静态库打包动态库 ( 仅做参考 ) III . 创建 Android Studio 工程 IV . FFMPEG 头 ...

  5. linux使用cmake交叉编译arm32程序

    linux使用cmake交叉编译arm32程序 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 linux使用cmake交叉 ...

  6. 脱离AS在windows下使用CMake交叉编译for Android

    脱离AS在windows下使用CMake交叉编译for Android 前言 可能有Android开发经验并搞过jni的撸友知道,使用Android ndk 中的ndk-build 结合Android ...

  7. 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )

    文章目录 安卓直播推流专栏博客总结 一. RTMP 协议 二. RTMP 协议使用 三. RTMPDump 源码下载 四. RTMPDump 源码交叉编译 五. RTMPDump 源码导入 Andro ...

  8. 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )

    文章目录 一.FFMPEG 源码下载 解压 二.交叉编译工具 三.configure 脚本及帮助命令 四.配置 configure 脚本 五.输出目录配置 六.函数库配置 七.程序配置选项 八.组件配 ...

  9. Windows下Qt+minGW+CMake+opencv配置--方法总结、文件分享与排错分享

    文章目录 1. 配置环境与概述 2.参考方法 3. minGW32-make遇到的错误 3.1. 解决策略 3.2. 解决步骤 3.3 源文件分享 4. Qt配置 4.1 将bin文件加入环境变量 4 ...

  10. Qt5.11.2+CMake+opencv配置及问题总结

    最近需要在Qt中使用opencv,查阅了各位大佬们的文章,前后遇到了很多教程中未提及的问题,主要是CMake opencv时遇到的,查找和筛选了大量资料,一点点找出了原因和解决办法.此处附上大佬们的原 ...

最新文章

  1. 学 JavaScript 伤不起……| 每日趣闻
  2. Xamarin.Android提示找不到mono.Android.Support.v4
  3. nginx服务器access_log日志分析及配置详解
  4. Leetcode-翻转图像(832)
  5. Linux启动nacos成功日志_微服务系列之Nacos配置中心
  6. 计算机一级某学校师资情况表,2011年计算机一级考试MS OFFICE上机考试指导
  7. elementUI 分页组件的使用 - 踩坑篇
  8. 商务办公管理咨询服务响应式模板
  9. 广东中山一楼盘在平台直播卖房 4小时售出600套
  10. 微服务升级_SpringCloud Alibaba工作笔记0024---Nacos集群_以及持久化配置_架构说明
  11. Python非本地语句
  12. springboot JPA 做security的时候出现查了user表却不自动查role表 报 session为空
  13. python实践统计学中的三大相关性系数,并绘制相关性分析的热力图
  14. 递归神经网络/_递归神经网络
  15. 微博表情插入mysql数据库,表情都是四字节字符
  16. 网络机顶盒固件编辑器_电信机顶盒刷固件补丁下载
  17. 《出版专业基础(初级)》2020版学习笔记2~8章
  18. PAT A 1013. Battle Over Cities
  19. 禁止chrome更新呢
  20. 选择题汇总3(括号里填的答案都是对的,不用管下面那个答案正确与错误,因为作者懒得删了)

热门文章

  1. XML配置文件的智能感知(IntelliSense)功能
  2. secure CRT连接华三、华为模拟器
  3. web安全day33:人人都要懂的LNMP--nginx的配置和文件理解
  4. C++构造函数、析构函数与抛出异常
  5. Linux命令使用练习二
  6. 初学 JAVA ,编程实例【人会说话,中国人说中国话,美国人说英语】
  7. linux安装neo4j
  8. Mysql 高负载排查思路
  9. Dalvik和Java运行环境的区别
  10. Windows Phone 7 Tips (8)