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

Ubuntu20.04交叉编译libnetfilter_queue遇未定义引用错误求助

问题原因
  1. 未使用交叉编译器:直接调用本地Ubuntu的g++编译,但目标平台是aarch64架构的Variscite IMX8,本地x86_64的库(如libnetfilter_queue)无法被aarch64编译器链接,导致未定义引用。
  2. TARGETSYSROOT配置错误:settings.json中TARGETSYSROOT指向单独的include目录,而非完整的交叉编译根文件系统,编译器无法找到对应架构的库文件。
  3. 目标架构依赖库缺失:交叉编译环境的sysroot中未安装aarch64版本的libnetfilter_queue-dev、libssl-dev等依赖库,链接阶段找不到函数实现。
解决步骤

1. 强制使用交叉编译器

放弃直接调用本地g++,改用settings.json中配置的aarch64交叉编译器,终端测试命令:

/home/raulgimenez/debian-imx8mm-var-dart/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ --sysroot=/home/raulgimenez/debian-imx8mm-var-dart/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc -o xg.bin ./src/main.cpp ./src/packet.cpp -lnetfilter_queue -lssl -lcrypto

2. 修正TARGETSYSROOT路径

修改settings.json中的TARGETSYSROOT为完整的交叉编译根文件系统路径:

"TARGETSYSROOT": "/home/raulgimenez/debian-imx8mm-var-dart/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc"

确保该路径下包含usr/lib、usr/include等完整目录结构。

3. 安装目标架构的依赖库

在交叉编译sysroot中安装aarch64版本的依赖:

  • 方法一:下载对应Debian包解压到sysroot:
    # 下载aarch64版本依赖包
    wget http://deb.debian.org/debian/pool/main/libn/libnetfilter-queue/libnetfilter-queue-dev_1.0.4-2_arm64.deb
    wget http://deb.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u5_arm64.deb
    # 解压到sysroot
    dpkg-deb -x libnetfilter-queue-dev_1.0.4-2_arm64.deb /home/raulgimenez/debian-imx8mm-var-dart/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/
    dpkg-deb -x libssl-dev_1.1.1n-0+deb11u5_arm64.deb /home/raulgimenez/debian-imx8mm-var-dart/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/
    
  • 方法二:交叉编译依赖库源码并安装到sysroot。

4. 配置Makefile统一编译流程

由于tasks.json中使用make构建,编写Makefile复用交叉编译配置:

# Makefile
CXX ?= $(CXX)
TARGET = xg.bin
SRC_FILES = ./src/main.cpp ./src/packet.cpp
SYSROOT = $(TARGETSYSROOT)
LDFLAGS = -L$(SYSROOT)/usr/lib/aarch64-linux-gnu -lnetfilter_queue -lssl -lcrypto

all: $(TARGET)

$(TARGET): $(SRC_FILES)
	$(CXX) -o $@ $^ $(LDFLAGS)

clean:
	rm -f $(TARGET)

VS Code的sudo build任务会自动调用交叉编译器,无需手动输入命令。

5. 验证编译结果

编译完成后,用file命令检查二进制文件架构:

file xg.bin

输出应包含aarch64字样,证明是目标平台的可执行文件。


内容的提问来源于stack exchange,提问作者Raul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:03:05