Bootstrap

交叉编译问题分析之--gcc与arm-linux-gcc的那些事

本着吃一堑长一智的态度,记录本次gcc编译问题的处理过程。

目录

1. 问题背景

2. 问题分析

本地编译

交叉编译

3. 问题解决

4. 问题总结


1. 问题背景

本地编译生成的二进制可执行程序,在本地可以正常执行。但上传到开发板后,执行报错,

本地执行:

目标板执行:

2. 问题分析

上传到开发板后执行出错,是因为代码编译执行的环境不同导致,这里需要清楚两个概念:"本地编译" 和 "交叉编译"。

本地编译

所谓"本地编译",是指 "编译源代码的平台" 和 "执行源代码编译后程序的平台" 是同一个平台。这里的平台,可以理解为CPU架构+操作系统。比如,在Intel x86架构/Windows 10平台下、使用Visual C++编译生成的可执行文件,在同样的Intel x86架构/Windows 10下运行。

交叉编译

所谓"交叉编译",是指 "编译源代码的平台" 和 "执行源代码编译后程序的平台" 是两个不同的平台。比如,在Intel x86架构/Linux(Ubuntu)平台下、使用交叉编译工具链生成的可执行文件,在ARM架构/Linux下运行。

回到问题本身,使用 "uname" 命令分别查看本地平台目标板平台。

本地平台信息如图所示:

 目标板平台信息如图所示:

由此可知,编译源代码的平台是 " Intel x86架构/Linux " ,而执行源代码编译后程序的平台是 " ARM架构/Linux "。

至此,问题明了,博主使用 gcc编译器 ,执行 " gcc xxx.c -o xxx " 命令进行编译,编译产物也就只能在 " Intel x86架构/Linux " 上执行;放到 ARM 架构上自然也就无法正确识别运行。

3. 问题解决

要在 " Intel x86架构/Linux " 平台进行编译,且编译产物在 " ARM架构/Linux " 执行,那就只有交叉编译了。

使用 arm-linux-gnueabihf-gcc 编译器,执行命令:" arm-linux-gnueabihf-gcc xxx.c -o xxx "。

注:使用交叉工具编译的产物,适用于目标板平台,因此无法在编译平台正常执行。

交叉编译产物在本地执行:

交叉编译产物在目标板执行:

4. 问题总结

该问题不在于技术,而在于对编译器基础知识的掌握,基础不牢,地动山摇。

                                                                             学海无涯,respect!

推荐阅读:

 嵌入式开发 | 什么是交叉编译(CROSS_COMPILE) - 知乎 (zhihu.com)

 arm 交叉编译器各种gcc 傻傻分不清楚:gnueabi,gnueabhf,none-eaib - 知乎

;