使用指定ARM工具链交叉编译的Makefile配置问题咨询
交叉编译问题排查与解决
核心问题原因
你编译得到x86_64架构程序的根本原因是Makefile默认调用了本机的x86架构GCC编译器,仅修改sysroot和链接路径不会替换编译器本身,因此产物架构不符合目标设备要求。
问题1解答:是否需要执行configure配置命令
- 如果你的项目是基于autotools构建、自带
configure脚本,则建议执行该配置命令:--build参数填写编译机架构,值为x86_64-linux-gnu--host参数填写目标设备架构,值为aarch64-yocto-linux
执行后configure会自动匹配交叉编译工具链、设置对应编译参数,无需手动修改Makefile。
- 如果你当前用的是手写的原生Makefile、没有
configure脚本,则不需要执行该命令,直接修改Makefile或配置环境变量即可。
问题2解答:工具链环境文件的使用方法
工具链自带的export环境配置文件必须使用,文件内已经预置了交叉编译需要的所有环境变量(包括CC/CXX编译器路径、CFLAGS/CXXFLAGS编译参数、SYSROOT根文件系统路径等),可以避免手动配置出错。
使用步骤:
- 编译前在当前终端执行命令加载环境变量:
(实际文件名以你工具链目录下的sh格式环境文件为准)source /opt/yocto/environment-setup-aarch64-yocto-linux - 加载完成后直接执行
make命令即可,Makefile内的$(CXX)等变量会自动指向aarch64架构的交叉编译器,无需手动修改Makefile的编译器配置。
额外优化建议
如果你不想每次都加载环境变量,也可以直接在现有Makefile开头补充交叉编译器配置,同时补全sysroot编译参数:
# 新增交叉编译器前缀配置 CROSS_COMPILE = aarch64-yocto-linux- CC = $(CROSS_COMPILE)gcc CXX = $(CROSS_COMPILE)g++ SYSROOT= /opt/yocto/sysroots/ # 编译参数补充--sysroot指定头文件查找路径 CXXFLAGS= -std=c++11 -I src/ --sysroot=$(SYSROOT) CCFLAGS= -std=c++11 -I src/ --sysroot=$(SYSROOT) CXX_LDFLAGS= -L $(SYSROOT)/aarch64-yocto-linux/lib -lpthread -pthread --sysroot=$(SYSROOT)
修改后编译完再次用file命令检查产物架构,确认输出为aarch64架构后再传到目标设备运行即可解决兼容问题。
内容的提问来源于stack exchange,提问作者user1538798
相关产品推荐
相关产品推荐

