You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析与修改建议

核心问题点

  1. 命令替换语法错误:CFLAGS中嵌套反引号,导致net-snmp-config --cflags的参数被错误解析,-linux被当成链接库参数,同时破坏了sysroot的正确传递,编译器找不到ARM架构的启动文件和系统库。
  2. 重复/混乱的sysroot设置:同时指定两个不同的sysroot路径,引发搜索路径冲突。
  3. 错误的net-snmp-config调用:BUILDAGENTLIBS使用目标路径下的net-snmp-config,交叉编译应使用sysroots-components下的交叉编译版本脚本。
  4. 参数顺序错误:编译时应遵循「编译参数→目标文件→链接库参数」的顺序,原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:59:52