【跨平台编译】【树莓派】在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位的,尝试修改为
报错,暂搁置。
看该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