Ubuntu 20.04.6交叉编译得到Ubuntu 16.04.6的可执行文件

一、前言

发现问题,在本地Windows计算机的Ubuntu上编译出可执行程序无法在px30上运行,报错:

"-bash: ./linux_rtu: cannot execute binary file: 可执行文件格式错误",于是看了一下版本,Windows系统上的是Ubuntu 20.04.6,而px30上的是Ubuntu 16.04.6,架构不匹配(x86_64 vs ARM,版本同步很麻烦所以在网上搜罗些关于交叉编译的资料自己整一下。

二、安装对应的交叉编译工具链

首先你可以查看一下本地编译出的可执行文件信息,我这里是 x86-64架构:

bash 复制代码
file ./linux_rtu
得到结果:
./linux_rtu: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, BuildID[sha1]=5014ed51e466b1fe076c62715d82807fddf63c11, for GNU/Linux 3.2.0, not stripped

然后再px30上执行指令,我这里是aarch64,armv7l和aarch64都是ARM架构

bash 复制代码
uname -m
得到结果:
aarch64

直接在本地执行命令安装对应的交叉编译工具:

bash 复制代码
# 对于 ARM 32位 (armhf)
sudo apt-get install g++-arm-linux-gnueabihf

# 对于 ARM 64位 (aarch64)
sudo apt-get install g++-aarch64-linux-gnu

三、重新交叉编译

我这里使用Cmake,建立build文件夹做结果分类,所以直接执行命令,然后就得到了我这里对应可执行程序:

bash 复制代码
# 清理之前的编译结果
rm -rf build/*
cd build

# 对于 ARM 32位
cmake -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..

# 对于 ARM 64位
cmake -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ ..

make

四、其他报错

如果报错这个:

bash 复制代码
./linux_rtu: /lib/aarch64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by ./linux_rtu)
./linux_rtu: /usr/lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./linux_rtu)
./linux_rtu: /usr/lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by ./linux_rtu)

大概就是链接库的原因,我这里的解决方案是直接在CMakeLists.txt中添加下面内容编译出静态库:

bash 复制代码
set(CMAKE_EXE_LINKER_FLAGS "-static")
相关推荐
腾讯蓝鲸智云3 分钟前
【运维自动化-节点管理】节点管理的插件策略如何使用
运维·自动化·云计算·sass·paas
疯狂成瘾者2 小时前
服务器的单体和集群
运维·服务器
liuhuizuikeai3 小时前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
初願致夕霞3 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
charlie1145141916 小时前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
飞Link6 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
消失的旧时光-19436 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
SWAGGY..7 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
kdxiaojie7 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习
烛衔溟7 小时前
TypeScript 接口继承与混合类型
linux·ubuntu·typescript