LS1043板交叉编译ARM应用报错,求Makefile修改方案
交叉编译LS1043应用时Makefile问题排查与修改建议
问题背景
使用LS1043开发板生成应用rootfs,在x86架构Ubuntu 20.04主机上交叉编译ARM目标应用时出错,怀疑Makefile存在问题,相关代码和报错信息如下:
原Makefile内容
LD=aarch64-fsl-linux-ld CC=aarch64-fsl-linux-gcc OBJS2=main.o terminalMode.o trap.o filedownload_spidev.o TARGETS=main CFLAGS=-I/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/usr/include --sysroot=/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/ -I/home/icomm/distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/sysroot-destdir/usr/include `/home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --cflags `-m64 -lrt -mcpu=cortex-a53 -mabi=lp64 -linux --sysroot=/home/icomm/distro/build_ls1043ardb/tmp/sysroots/ls1043ardb -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -pthread BUILDLIBS=-L/home/icomm/distro/build_ls1043ardb/tmp/sysroots/ls1043ardb/lib `/home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --libs` -L/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/lib -L /opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/usr/lib BUILDAGENTLIBS=-L/home/icomm//distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/image/usr/lib `/home/icomm/distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/image/usr/bin/net-snmp-config --agent-libs` DLFLAGS=--disable-debugging all: $(TARGETS) main: $(OBJS2) $(CC) -o main $(CFLAGS) $(OBJS2) $(BUILDLIBS) $(BUILDAGENTLIBS) clean: rm $(OBJS2) $(TARGETS)
报错信息
aarch64-fsl-linux-gcc -o main -I /opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/usr/include --sysroot=/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/ -I/home/icomm/distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/sysroot-destdir/usr/include `/home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --cflags `-m32 -lrt -mcpu=cortex-a53 -mabi=lp64 -linux --sysroot=/home/icomm/distro/build_ls1043ardb/tmp/sysroots/ls1043ardb main.o terminalMode.o trap.o filedownload_spidev.o -L /home/icomm/distro/build_ls1043ardb/tmp/sysroots/ls1043ardb/ `/home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --libs` -L /opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/usr/lib/ -L/home/icomm//distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/image/usr/lib `/home/icomm/distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/image/usr/bin/net-snmp-config --agent-libs` /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: warning: library search path "/usr/lib" is unsafe for cross-compilation /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find Scrt1.o: No such file or directory /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find crti.o: No such file or directory /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find crtbeginS.o: No such file or directory /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find -linux /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find -lpci /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find -lgcc /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find -lgcc_s /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find /lib/libc.so.6 /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find /usr/lib/libc_nonshared.a /opt/fsl-qoriq/3.1/sysroots/x86_64-fslsdk-linux/usr/libexec/aarch64-fsl-linux/gcc/aarch64-fsl-linux/9.3.0/real-ld: cannot find /lib/ld-linux-aarch64.so.1 collect2: error: ld returned 1 exit status make: *** [Makefile:32: main] Error 1
问题分析与修改建议
核心问题点
- 命令替换语法错误:
CFLAGS中嵌套反引号,导致net-snmp-config --cflags的参数被错误解析,-linux被当成链接库参数,同时破坏了sysroot的正确传递,编译器找不到ARM架构的启动文件和系统库。 - 重复/混乱的sysroot设置:同时指定两个不同的sysroot路径,引发搜索路径冲突。
- 错误的net-snmp-config调用:
BUILDAGENTLIBS使用目标路径下的net-snmp-config,交叉编译应使用sysroots-components下的交叉编译版本脚本。 - 参数顺序错误:编译时应遵循「编译参数→目标文件→链接库参数」的顺序,原Makefile参数顺序混乱导致解析错误。
修改后的Makefile
LD=aarch64-fsl-linux-ld CC=aarch64-fsl-linux-gcc OBJS2=main.o terminalMode.o trap.o filedownload_spidev.o TARGETS=main # 分离net-snmp的cflags调用,避免嵌套反引号错误 SNMP_CFLAGS := $(shell /home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --cflags) CFLAGS=-I/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/usr/include \ --sysroot=/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/ \ -I/home/icomm/distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/sysroot-destdir/usr/include \ -m64 -mcpu=cortex-a53 -mabi=lp64 \ -pthread \ $(SNMP_CFLAGS) # 使用交叉编译版本的net-snmp-config获取链接参数 SNMP_LIBS := $(shell /home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --libs) SNMP_AGENT_LIBS := $(shell /home/icomm/distro/build_ls1043ardb/tmp/sysroots-components/aarch64/net-snmp/usr/bin/crossscripts/net-snmp-config --agent-libs) BUILDLIBS=-L/home/icomm/distro/build_ls1043ardb/tmp/sysroots/ls1043ardb/lib \ -L/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/lib \ -L/opt/fsl-qoriq/3.1/sysroots/aarch64-fsl-linux/usr/lib \ $(SNMP_LIBS) BUILDAGENTLIBS=-L/home/icomm/distro/build_ls1043ardb/tmp/work/aarch64-fsl-linux/net-snmp/5.9.3-r0/image/usr/lib \ $(SNMP_AGENT_LIBS) # 链接优化参数单独放在LDFLAGS中 LDFLAGS=-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -lrt DLFLAGS=--disable-debugging all: $(TARGETS) # 调整参数顺序,符合编译链接规范 main: $(OBJS2) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS2) $(BUILDLIBS) $(BUILDAGENTLIBS) clean: rm -f $(OBJS2) $(TARGETS)
额外注意事项
- 确保交叉编译工具链的
PATH环境变量已正确配置,包含aarch64-fsl-linux-*工具的路径。 - 检查
sysroot路径下是否存在完整的ARM架构系统库和启动文件(Scrt1.o、crti.o等),缺失则需重新构建或获取完整rootfs。 - 编译前执行
make clean清理旧目标文件,避免残留的x86架构文件干扰。
内容的提问来源于stack exchange,提问作者Dibyarekha Maharana
相关产品推荐
相关产品推荐

