aarch64-linux-gnu-gcc交叉编译ARM程序时main.o格式错误问题
问题根因
本次链接错误的核心原因是交叉编译器配置不全:
- 编译C++源码
main.cpp时,调用了宿主x86架构的原生g++,生成x86格式的main.o;其余C语言源码使用你指定的aarch64-linux-gnu-gcc编译,生成正确的ARM aarch64格式目标文件,二者架构不匹配导致链接失败。 - 你配置的
--host=arm-elf-linux参数与目标aarch64架构不匹配,也会导致部分编译规则默认使用原生编译器。
解决方案
方案1:全局修正编译配置(推荐)
先清理历史编译缓存,避免旧文件干扰:
make distclean
执行修正后的configure命令,同时指定C、C++全链路交叉编译器和正确的目标架构参数:
./configure --host=aarch64-linux-gnu \ CC=aarch64-linux-gnu-gcc \ CXX=aarch64-linux-gnu-g++ \ AR=aarch64-linux-gnu-ar \ RANLIB=aarch64-linux-gnu-ranlib \ --disable-sdl --disable-ffmpeg --disable-v4l2 --disable-openh264 --disable-libwebrtc --disable-libyuv
重新编译即可:
make dep && make
方案2:仅修改PJSUA2_TEST模块配置(临时修复)
如果你不想重新执行全量配置,可直接在你定位到的Makefile代码段中,为C++源码单独指定交叉编译器:
# Defines for building pjsua2-test application export PJSUA2_TEST_SRCDIR = ../src/pjsua2-test export PJSUA2_TEST_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) main.o export PJSUA2_TEST_CFLAGS += $(_CFLAGS) $(PJ_VIDEO_CFLAGS) export PJSUA2_TEST_CXXFLAGS = $(_CXXFLAGS) $(PJSUA2_LIB_CFLAGS) $(PJ_VIDEO_CFLAGS) export PJSUA2_TEST_LDFLAGS += $(PJ_LDXXFLAGS) $(PJ_LDXXLIBS) $(LDFLAGS) # 新增下面这行,指定C++交叉编译器 export PJSUA2_TEST_CXX = aarch64-linux-gnu-g++
注意:修改后必须删除已生成的x86架构main.o文件,否则会复用旧文件导致问题依旧,之后重新执行make即可编译通过。
内容的提问来源于stack exchange,提问作者SleepyCat
相关产品推荐
相关产品推荐

