Ubuntu20.04交叉编译libnetfilter_queue遇未定义引用错误求助
问题原因
- 未使用交叉编译器:直接调用本地Ubuntu的
g++编译,但目标平台是aarch64架构的Variscite IMX8,本地x86_64的库(如libnetfilter_queue)无法被aarch64编译器链接,导致未定义引用。 - TARGETSYSROOT配置错误:settings.json中
TARGETSYSROOT指向单独的include目录,而非完整的交叉编译根文件系统,编译器无法找到对应架构的库文件。 - 目标架构依赖库缺失:交叉编译环境的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
相关产品推荐
相关产品推荐

