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
相关产品推荐
相关产品推荐

