Ubuntu静态编译链接libnftnl提示cannot find -lnftnl如何排查
链接错误原因
/usr/bin/ld: cannot find -lnftnl报错由两个配置问题直接导致:
- Ubuntu环境下通过apt安装的
libnftnl-dev、libnftnl11包,库存放路径为/usr/lib/x86_64-linux-gnu/(x86_64架构默认路径,arm架构路径为/usr/lib/aarch64-linux-gnu/),编译命令中手动指定的/usr/local/lib/路径下不存在libnftnl库文件,链接器搜索失败。 - 编译命令中添加了
-static静态编译参数,但默认apt安装的libnftnl、libmnl相关包默认不附带静态库文件(静态库后缀为.a,apt安装的dev包默认仅提供后缀为.so的动态库链接入口),即使修正路径,静态编译也会因缺少静态库文件报错。
修复方案
根据编译需求二选一即可:
方案1:使用动态编译(推荐,无额外依赖安装)
直接移除错误的路径指定参数和静态编译参数,使用系统默认库搜索路径编译即可,命令如下:
gcc x.c -o x -lnftnl -lmnl
系统默认会自动扫描架构对应的库存放路径,无需手动添加-L参数即可找到已安装的libnftnl、libmnl动态库。
方案2:必须使用静态编译
- 先补全依赖的静态库文件,执行命令重装dev包确认静态文件就位:
sudo apt update && sudo apt install --reinstall libnftnl-dev libmnl-dev
- 修正编译命令中的库搜索路径为系统库存放路径,x86_64架构可直接使用如下命令:
gcc x.c -o x -static -L/usr/lib/x86_64-linux-gnu/ -lnftnl -lmnl
- 如果执行后仍提示缺少libc、libz这类系统级静态库,执行命令安装基础静态依赖包即可:
sudo apt install libc6-dev zlib1g-dev
校验方法
编译前可以先执行命令确认库文件真实存在,避免路径配置错误:
- 查询libnftnl库文件位置:
dpkg -L libnftnl-dev | grep libnftnl - 查询libmnl库文件位置:
dpkg -L libmnl-dev | grep libmnl
正常返回结果中会包含对应.so(动态库)或.a(静态库)文件的完整路径,编译时-L参数指定到该文件所在目录即可。
内容的提问来源于stack exchange,提问作者BitFriends
相关产品推荐
相关产品推荐

