Ubuntu20.04编译libpcap程序提示`pcap_init`未定义引用如何解决
问题原因
你的报错根源是编译链接阶段使用的是系统自带的旧版libpcap 1.9.1,而非你手动编译安装的1.11.0预览版:
- 头文件可以找到
pcap_init声明,是因为你手动安装的新版头文件已经写入了/usr/local/include或者覆盖了系统路径的头文件,编译阶段可以正常识别 - 链接阶段默认优先查找系统库路径(如
/usr/lib/x86_64-linux-gnu/)下的libpcap.so,该文件对应版本为1.9.1,本身没有实现pcap_init函数(该函数是libpcap 1.10及以上版本才新增的),因此抛出未定义引用错误 - 注释
pcap_init后运行打印的版本号为1.9.1,也直接验证了实际加载的是系统旧版库
解决方案
有两种可选方案,按需选择即可:
方案1:保留系统旧版libpcap,优先使用手动安装的新版
- 编译时指定新版库的安装路径,编译命令修改为:
g++ csniff.cc -o csniff -L/usr/local/lib -lpcap
- 配置动态库加载路径,避免运行时还是加载旧版库:
- 执行命令写入库路径配置:
sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/libpcap_local.conf
- 刷新动态库缓存:
sudo ldconfig
配置完成后直接运行./csniff即可正常加载新版libpcap,打印的版本号会变为1.11.0-PRE-GIT。
方案2:卸载系统旧版libpcap,全局只用新版
如果不需要保留系统自带的libpcap,可以先卸载系统版本,再重新编译安装你下载的新版libpcap:
- 卸载系统旧版:
sudo apt remove -y libpcap-dev libpcap0.8
- 回到你克隆的libpcap源码目录,重新执行
configure、make、sudo make install - 执行
sudo ldconfig刷新缓存
之后编译运行都不需要额外加参数,直接用你原来的g++ csniff.cc -o csniff -lpcap即可正常运行。
内容的提问来源于stack exchange,提问作者Zane Phillips
相关产品推荐
相关产品推荐

