主機:Ubuntu10.04
交叉編譯器:EABI-4.3.3
CMake在ubuntu系統下預設使用系統的gcc、g++編譯器,編譯arm下的程式要使用arm-linux-gcc,需要對CMake進行設定(通過在CMakeLists.txt中指定交叉編譯器的方法)。
在CMakeLists.txt一開始加入相關設定:
#告知當前使用的是交叉編譯方式,必須配置
SET(CMAKE_SYSTEM_NAME Linux)#指定C交叉編譯器,必須配置
#或交叉編譯器使用絕對地址
SET(CMAKE_C_COMPILER "arm-linux-gcc")#指定C++交叉編譯器
SET(CMAKE_CXX_COMPILER "arm-linux-g++")#不一定需要設定
#指定交叉編譯環境安裝目錄...
SET(CMAKE_FIND_ROOT_PATH "...")
#從來不在指定目錄下查詢工具程式
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#只在指定目錄下查詢庫檔案
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#只在指定目錄下查詢標頭檔案
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

二 交叉编译
现在希望最终编译的程序是运行在arm linux系统上的,这就需要交叉编译。

1. 设置系统和工具链
对于交叉编译,CMake并不知道目标系统是什么,所以需要设置一些CMake变量来告知CMake,

CMAKE_SYSTEM_NAME:即目标系统名,这里是Linux
CMAKE_SYSTEM_PROCESSOR :目标系统的处理器名,这里是arm
对于工具链,则是通过下面2个变量来定位,

CMAKE_C_COMPILER:C编译器的可执行文件名称
CMAKE_CXX_COMPILER:C++编译器的可执行文件名称
这些变量可以在调用CMake时通过命令行传递,但是这种做法容易出错,而且用起来不方便,所以CMake提供了工具链文件的方式来传递这些变量信息。

2. 工具链文件
我们在工程里新建一个文件叫arm_linux_setup.cmake,放置位置如下(也可以放在别的地方),

其内容如下,

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(tools /home/wh/work/cross_compile/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)

tools是本人使用的交叉工具链路径,可以根据自己的实际文件来做修改。

3. 编译
使用CMake的变量CMAKE_TOOLCHAIN_FILE来指定工具链文件,cd到build目录,然后执行下面的命令,

// 注意,工具链文件的指定一定要紧跟cmake命令之后,不能放到 .. 后面
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake ..
1
2
ok后再执行make,就可以生成main的elf文件,

使用file命令去查看这个文件,可以看到其运行平台是32位ARM处理器上的Linux系统,

使用工具链文件的好处就是只要编写一遍,然后在任意地方只需要使用CMAKE_TOOLCHAIN_FILE去指定其位置就可以了,非常方便。

cmake 交叉编译工具链相关推荐

  1. cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义

    Keil MDK是非常常用的单片机开发集成环境,Keil公司2005年由ARM公司收购,现在是ARM主要的嵌入系统开发平台(ARM的另一个开发环境ds-5早在九年前就停止更新了). Keil虽然是个集 ...

  2. cmake:ESP32交叉编译工具链定义

    ESP32的SDK(ESP-IDF)本身提供了esp32平台的cmake toolchain文件: esp-idf-v4.4\tools\cmake\toolchain-esp32.cmake 1就是 ...

  3. Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG

    Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...

  4. 自己动手安装ARM交叉编译工具链

    一,首先说一下在linux中安装软件的特点: 相比windows下安装要稍显复杂,linux中安装一般有以下几种方法: 1.在线安装,譬如ubuntu中使用apt-get install vim 来安 ...

  5. arm-linux交叉编译工具链的制作(基于S3C2440)【转】

    本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...

  6. linux centos7 使用 crosstool-ng 构建 交叉编译 工具链 即构建各cpu架构平台的gcc编译器

    简介 crosstool-ng,全称是crosstool Next Generation,即下一代crosstool.crosstool是个交叉编译器的制作工具,但是做的不够好,于是有人(Yann E ...

  7. 使用 Android NDK 的交叉编译工具链移植 C/C++ 项目到安卓平台

    什么是 NDK? Android NDK 是一套可以让开发者在安卓应用开发中使用 C/C++ 实现特定模块的工具集,不是所有应用都需要用到,但是正确地使用可以有效提高应用运行效率和安全性. 为什么要在 ...

  8. arm-buildroot-linux-,buildroot构建交叉编译工具链,根文件系统

    支持多种处理器,arch,avr32,mips,x86等等,在arch/目录可查看. buildroot可使用make menuconfig进行配置,选择需要编译到目标文件系统的包,相关的配置文件在c ...

  9. 如何添加交叉编译工具链(toolchain)到环境变量?(--sysroot路径)(新:ubuntu交叉编译工具链环境变量的配置)

    文章目录 查看当前环境变量 `echo $PATH` 添加环境变量 --sysroot 新:ubuntu交叉编译工具链环境变量的配置(20220105) 查看当前环境变量 echo $PATH [ro ...

  10. Arm Linux 交叉编译(交叉编译是什么?CROSS_COMPILE)(交叉编译工具链【待更】)

    文章目录 交叉编译 1.编译 2.本地编译 3.交叉编译 交叉编译工具链 交叉编译 在嵌入式系统开发中,经常会听到一个词:交叉编译.到底什么是"交叉编译"呢?为什么要使用" ...

最新文章

  1. React学习笔记4: React脚手架配置代理
  2. C语言函数集(十一)
  3. golang panic和recover 捕获异常
  4. 推荐ApacheCN开源的一个机器学习路线图
  5. 如何将本地代码使用Git上传至Github
  6. nQueen问题java实现
  7. Fragment学习笔记
  8. 一个教务系统多少钱_ERP系统多少钱
  9. ubuntu查看本地ip
  10. kubernetes视频教程笔记 (8)-资源类型
  11. 学生如何免费使用Jetbrains旗下包含Pycharm等开发工具(中文详细教程)
  12. 浅谈,盘点历史上有哪些著名的电脑病毒,80%的人都不知道!
  13. ps教程|photoshop入门教程|ps高阶段精通教程附百度云资源
  14. 在pfSense上使用pfBlockerNG(DNSBL)拦截广告
  15. 初探MySQL的语句之二
  16. PUE 1.2,总投资达36.4亿,17600个机柜!天和防务拟建陕西最大数据中心
  17. POJ - 1789 Truck History (最小生成树)
  18. 湘潭大学计算机科学与技术录取分数线,计算机科学与技术专业分数线各大学排名(湖南)...
  19. 让建设银行晕倒的女人
  20. 我的杂谈之学习陈氏太极拳精要18势

热门文章

  1. 广东省地方税务局电子办税服务厅--卡在注册ca证书界面的处理
  2. android 使用画布实现电子签名板功能并保存到本地
  3. 候鸟浏览器cookie登录教程
  4. jQuery API .ajaxComplete()
  5. grads插值_GrADS中填色标尺cbarn用法
  6. Yalmip最优化求解器+matlab | 教程(一)
  7. 中南大学计算机学院考研好考吗,中南大学or湖南大学:我考研选学校的心路历程...
  8. vs编译与停止调试时卡顿、无响应的问题
  9. CF Round #537 (Div. 2)
  10. NestJS生成二维码