IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> gcc编译c源文件为so动态连接库时报错/mingw32/bin/ld.exe: cannot find -lpcap -> 正文阅读

[C++知识库]gcc编译c源文件为so动态连接库时报错/mingw32/bin/ld.exe: cannot find -lpcap

最近,在做项目时需要抓取过网卡的数据包然后解析提取有用的字段值。由于前期项目都在应用层进行开发,所以是基于Java代码进行的,但现在要抓包分析,显然不能用Java代码实现了。经过思考,决定使用c++进行开发,然后编译为Java可执行的文件不就行了。说做就做!

首先,由于本人没有学过c++,于是只能去找现成的代码进行修改。

弄完代码,编译执行都没问题,接下开始进行so文件的编译。

E:\Cprogram\TTL>g++ ttl.cpp -L.ttl.so -o main
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x1c): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x35): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x5d): undefined reference to `ntohl@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x71): undefined reference to `ntohl@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x89): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0xa2): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0xc5): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x31c): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x351): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x3bb): more undefined references to `ntohs@4' follow
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x450): undefined reference to `inet_ntoa@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x471): undefined reference to `inet_ntoa@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x586): undefined reference to `ntohs@4'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x76b): undefined reference to `pcap_findalldevs'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x870): undefined reference to `pcap_freealldevs'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x8d0): undefined reference to `pcap_open_live'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x901): undefined reference to `pcap_freealldevs'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x92c): undefined reference to `pcap_freealldevs'
C:\Users\14714\AppData\Local\Temp\ccrvoQSP.o:ttl.cpp:(.text+0x985): undefined reference to `pcap_loop'
collect2.exe: error: ld returned 1 exit status

好家伙!首先,注意到undefined reference to `ntohs@4'错误。大家在vc++等编辑器里编译的时候应该都遇到过这个问题。错误原因是缺少了必要的链接库-lwsock32,加上该属性重新执行。

E:\Cprogram\TTL>g++ ttl.cpp -lwsock32 -fPIC -shared -o ttl.so
C:\Users\14714\AppData\Local\Temp\ccydjmLD.o:ttl.cpp:(.text+0x76b): undefined reference to `pcap_findalldevs'
C:\Users\14714\AppData\Local\Temp\ccydjmLD.o:ttl.cpp:(.text+0x870): undefined reference to `pcap_freealldevs'
C:\Users\14714\AppData\Local\Temp\ccydjmLD.o:ttl.cpp:(.text+0x8d0): undefined reference to `pcap_open_live'
C:\Users\14714\AppData\Local\Temp\ccydjmLD.o:ttl.cpp:(.text+0x901): undefined reference to `pcap_freealldevs'
C:\Users\14714\AppData\Local\Temp\ccydjmLD.o:ttl.cpp:(.text+0x92c): undefined reference to `pcap_freealldevs'
C:\Users\14714\AppData\Local\Temp\ccydjmLD.o:ttl.cpp:(.text+0x985): undefined reference to `pcap_loop'
collect2.exe: error: ld returned 1 exit status

这次问题的原因是提示的几个函数在引用的头文件中只进行了定义,而没有去实现,需要对方法进行导出(由于本人才疏学浅,也没玩过c++,所以不是很理解怎么操作,所以大家可以去查查这个怎么实现)。我所使用的方法是在编译语句后面使用-lpcap选项。

E:\Cprogram\TTL>g++ ttl.cpp -lwsock32 -fPIC -shared -o ttl.so -lpcap
d:/program files (x86)/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lpcap
collect2.exe: error: ld returned 1 exit status

注意,关键错误出现了!该错误其实讲得很明白,找不到lpcap库文件。

根据博文:MinGW使用GCC编译,出现ld.exe: cannot find -ladvapi32_xuzonghao的博客-CSDN博客

需要将对应库文件放到指定目录里就行,或者当你不知道应该放到那个目录时就在网上下载WpdPack,解压后在其lib目录里找到libwpcap.a文件,复制路径添加到上面的编译指令里去替换-lpcap。

g++ ttl.cpp -lwsock32 -fPIC -shared -o ttl.so "D:\Program Files (x86)\Microsoft Visual Studio\WpdPack\Lib\libwpcap.a"

同理,如果不是-lpcap,而是其它库文件错误,以上方法同样适用!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-15 11:29:21  更:2022-05-15 11:30:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 18:27:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码