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

Ubuntu 20.04下编译依赖libnftnl的C程序时出现链接错误求助

Ubuntu 20.04下编译依赖libnftnl的C程序时出现链接错误求助

看起来你在链接阶段的库路径配置犯了个小错误,我来帮你把问题理顺~

首先,你当前Makefile里的LIBS参数写法有问题:-L选项的作用是告诉链接器库文件所在的目录,而不是直接指向.so文件本身!你现在写的-L/usr/lib/x86_64-linux-gnu/libmnl.so和-L/usr/lib/x86_64-linux-gnu/libnftnl.so完全不符合-L的用法,这才是链接器找不到-lnftnl的核心原因。

接下来给你几个具体的修正步骤:

1. 修正Makefile的库路径配置

把LIBS里的-L参数改成指向库所在的目录(而不是具体文件),其实/usr/lib/x86_64-linux-gnu是Ubuntu的标准系统库目录,链接器默认会搜索这个路径,所以甚至可以直接省略-L,简化成:

LIBS = -lmnl -lnftnl

2. 调整编译命令的参数顺序(重要)

链接器对参数顺序有要求:依赖的库要放在源文件的后面。你之前的编译命令把$(LIBS)放在$(CFLAGS)前面,容易导致符号找不到的问题,建议调整成:

CFLAGS = -static -s
LIBS = -lmnl -lnftnl

prog:
    gcc prog.c -o prog $(CFLAGS) $(LIBS)

3. 静态编译的额外注意事项

你用了-static静态编译选项,这时候需要确保系统里有这两个库的静态版本(.a文件)。libnftnl-dev和libmnl-dev包通常会包含静态库,但如果还是报错,可以先检查目录里是否存在静态库文件:

ls /usr/lib/x86_64-linux-gnu/libnftnl.a /usr/lib/x86_64-linux-gnu/libmnl.a

如果文件不存在,尝试重新安装开发包:

sudo apt install --reinstall libnftnl-dev libmnl-dev

4. 先测试动态编译排除问题

如果静态编译还是有麻烦,可以先去掉-static选项,测试动态编译是否能成功,这样能快速排除库本身的问题:

CFLAGS = -s
LIBS = -lmnl -lnftnl

prog:
    gcc prog.c -o prog $(CFLAGS) $(LIBS)

按照上面的步骤调整后,应该就能解决链接器找不到库的问题啦~

备注:内容来源于stack exchange,提问作者Wilson-programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:19:50