当前位置: 首页 > news >正文

【跨平台编译】【树莓派】在x86上编译树莓派上运行的CC++代码,搭建树莓派4B的跨平台编译环境

在嵌入式平台如树莓派、国产SoC上开发C++应用,远程登录树莓派修改代码、编译比较低效,笔者调研跨平台编译技术、调试CMAKE最终实现了在x86系统上编译出树莓派4B可运行的二进制可执行文件。

基本环境

  • 本地是Ubuntu20.04,x86系统。
  • 树莓派硬件是4B,Ubuntu24.04,aarch64系统。

实现方法

参考博客https://blog.csdn.net/baimei4833953/article/details/114595197 给出的方法,使用raspberrypi的官方库,发现无法运行,分析参考给出的是面向32位的ARM,而树莓派4B是64位的,尝试修改为修改toolchain类型
报错,暂搁置。

看该tools的readme,称该工程已经过时了,建议直接apt安装目标编译器,

sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu

注意下面cmake中gcc-aarch64、g++aarch64路径/usb/bin要匹配实际位置。

实测可用的cmake配置

# 设置目标系统名称
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)# 设置交叉编译器
set(TOOLCHAIN_PREFIX aarch64-linux-gnu)# 指定工具链路径(根据实际安装路径修改)
set(TOOLCHAIN_PATH  /usr/bin)# 设置编译器
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_AR ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-ar)
set(CMAKE_LINKER ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-ld)
set(CMAKE_NM ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-nm)
set(CMAKE_OBJCOPY ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-objcopy)
set(CMAKE_OBJDUMP ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-objdump)
set(CMAKE_STRIP ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-strip)
set(CMAKE_RANLIB ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX}-ranlib)# 设置系统根目录(从树莓派复制的文件系统)
set(CMAKE_FIND_ROOT_PATH ~/rpi-rootfs)# 只在根目录中查找库和头文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)set(CMAKE_C_FLAGS "-march=armv8-a" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "-march=armv8-a" CACHE STRING "" FORCE)

将上述cmake保存为ras64.cmake文件,
进入工程代码,

cmake .. -DCMAKE_TOOLCHAIN_FILE=/<路径>/ras64.cmake 
make

相关命令

#查看系统架构
uname -m
#查看CPU类型
dpkg --print-architecture
http://www.dtcms.com/a/361961.html

相关文章:

  • ccache编译加速配置
  • Meteor主题友链页面自研
  • Qt 的信号signal的参数是否会在内部被拷贝?
  • Vue3 中 Proxy 在组件封装中的妙用
  • 【网络安全入门基础教程】网络安全零基础学习方向及需要掌握的技能
  • Electron 应用生命周期管理:app 模块核心 API
  • 【 HarmonyOS 】错误描述:The certificate has expired! 鸿蒙证书过期如何解决?
  • 光学神经网络与人工智能应用
  • 网络流量分析——熟悉Wireshark
  • 【洛谷】【模板】栈、有效的括号、验证栈序列、后缀表达式、(stack相关算法题)
  • 腾讯位置商业授权微信小程序获取城市列表
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十三)控件中常用文本格式
  • 玩转OurBMC第二十一期:前端页面仪表盘的设计与使用实践
  • js 海康视频插件的具体步骤
  • QMainWindow使用QTabWidget添加多个QWidget
  • Simulink库文件-一种低通滤波模块搭建方法
  • 优化正则表达式性能:预编译与模式匹配的最佳实践
  • 均值滤波和中值滤波的简介、C语言实现和实测
  • 边缘计算设备 RK3576芯片
  • CGroup 资源控制组 + Docker 网络模式
  • NLP大语言模型数据准备
  • NLP技术突破:浅层与深层语义分析全解析
  • 嵌入式学习(day37) 数据库 Sqlite相关命令函数
  • Salesloft OAuth漏洞影响范围大幅增加,波及所有集成应用
  • 可编辑115页PPT | 某纸制品制造企业数字化转型战略规划项目建议书
  • 闭包的简单讲解
  • 三、数据结构
  • VMware安装
  • 基于docker-compose搭建EFK(Elasticsearch+fluentd+kibana)的日志平台
  • 【高等数学】第十章 重积分——第五节 含参变量的积分