本着吃一堑长一智的态度,记录本次gcc编译问题的处理过程。
目录
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!
推荐阅读: