1074|1

185

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

【米尔 NXP i.MX93 开发板评测】cmake交叉编译 [复制链接]

本帖最后由 小麦克 于 2024-8-13 15:48 编辑

cmake交叉编译模版工程

本文通过一个简单的示例,演示如何在 CMake 工程中添加交叉编译的配置,实现编译不同硬件平台的可执行文件。

CMake概述

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。

而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,所以可以把CMake看成一款自动生成 Makefile的工具,其编译流程如下图:

示例

目录结构

  1. $ tree
  2. .
  3. ├── arm_linux_setup.cmake
  4. ├── CMakeLists.txt
  5. └── hello.c
  6. 1 directory, 3 files

arm_linux_setup.cmake

这里的aarch64-buildroot-linux-gnu-gcc是通过buildroot生成的交叉编译器,其他编译器也可以用,名称有差异,记得替换

  1. set(CMAKE_SYSTEM_NAME Linux)
  2. set(CMAKE_SYSTEM_PROCESSOR aarch64)
  3. set(target_arch aarch64-linux-gnu)
  4. set(CMAKE_C_COMPILER aarch64-buildroot-linux-gnu-gcc)
  5. set(CMAKE_CXX_COMPILER aarch64-buildroot-linux-gnu-g++)
  6. set(CMAKE_LIBRARY_ARCHITECTURE ${target_arch} CACHE STRING "" FORCE)
  7. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  8. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  9. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  10. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

CMakeLists.txt

  1. cmake_minimum_required(VERSION 3.1.3)
  2. project(hello)
  3. set( HELLO_SRCS hello.c)
  4. add_executable(${PROJECT_NAME} ${HELLO_SRCS})

hello.c

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. printf("Hello, CMake\n");
  5. return 0;
  6. }

编译

在项目根目录下面新建一个build,放cmake生成的中间文件

  1. mkdir build
  2. cd build
  3. cmake ..
  4. # 编译成主机平台
  5. make
  6. # 编译成功生成x86-64平台hello
  7. $ file hello
  8. hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d55b52333ab9da5f0b106b3af84a8d4ef78f9a02, for GNU/Linux 3.2.0, not stripped

交叉编译

  1. # 交叉编译
  2. rm -rf *
  3. cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake ..
  4. make
  5. # 交叉编译成功生成aarch64平台hello
  6. $ file hello
  7. hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 6.1.0, not stripped

上传开发板执行试试~

最新回复

cmake确实好用,以前还去学了Makefile,不过学了也没坏处。   详情 回复 发表于 2024-8-13 19:19
点赞 关注
 

回复
举报

7519

帖子

2

TA的资源

版主

沙发
 

cmake确实好用,以前还去学了Makefile,不过学了也没坏处。

 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
用于433MHz ISM频带的低功耗超再生接收器

用于433MHz ISM频带的低功耗超再生接收器 慧聪网2006年5月12日9时40分信息来源:EDN China   设计师经常选择 ...

最坏分析

最坏分析其实就是极端值分析:让你知道怎么样才会出问题。 Assure acceptable operation throughout the entire ...

[DIY]二十四小时的感动(古典版I) 自制QS30-1辉光管电子时钟【附百张图】

辉光管是电子管的一种,属于很古老的数码显示器件,在没有LED的年代,显示数字和符号就靠它。这种管子现在应该算古董了,这次DI ...

msp430 LaunchPad 驱动9320TFT液晶(有图有代码)

本例使用MSP430G2553实现,其他型号一样适用,仅改下头文件就OK TFT的主控型号为ili9320 ;9325也可以,仅需在程序中改动型号。 ...

从《圣经密码》想到的数列问题及python解法

这几天,孩子的数学课外学习群里,老师不再发几何、组合、数论、应用题了,连续天天发数列题。 老师把好好的学习氛围搞得跟脑 ...

Java后端开发需要的技术

Servlet Servlet技术是Java后端的重要技术之一,作为Java Web开发的核心组件,Servlet承担了Web MVC结构中的核心作用(功能导 ...

Adafruit Trinkey QT2040 迷你USB开发板

543539 543540 https://www.adafruit.com/product/5056

改造4-20mA两线制无源数显表第十贴(小功告成)

告别“下半身”:从预留的开槽连接处刀划切痕、掰断,改造板终于可以独立面世了: 548400 548401 548403 ...

【上海航芯 ACM32F070开发板+触控功能评估板测评】移植RT-Thread Nano

【上海航芯 ACM32F070开发板+触控功能评估板测评】移植RT-Thread Nano 为了更好的方便大家,同时方便自己,按照我的习惯,放 ...

春风吹拂万物新,天气晴朗去踏青

795310 795311 795312 795313 795314 795315

关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 7

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表