go - 如何在我的 go 程序中消除对 wpcap.dll 的需求?
问题描述
我在我的程序中使用 gopacket。在linux上,它运行完美。但是在 Windows 上,如果我之前没有安装 WinPcap,整个程序就会崩溃。
我的计划是检查是否安装了 WinPcap,如果未安装,则通知用户他需要它才能使用 100% 的所有功能。
但我不明白这一点。如果 WinPcap 不可用,我不能使用 gopacket。我的意思是......没有一行代码(=>崩溃)
有谁知道我该如何解决这个问题?我实际上不需要 gopacket。我的计划是,如果安装了,很好,超级!如果没有,不要在意......做其他事情。
但现在我有 2 个选择......完全删除 gopacket 或找到一种无需 wpcap.dll 即可启动我的程序的方法。至少告诉用户他需要它。
请帮我 :(
解决方案
你错了,因为你“没有[使用]它的一行代码”:不难看出它的Windows 特定代码调用了winpcap.dll
.
更有趣的是,它的Unix 特定代码调用libpcap.so
,这意味着您可以在本地系统上运行它,这仅仅是因为您libpcap
安装了包(或代码中的任何名称)。
所有这一切意味着目前您的程序无论如何都不是真正可移植的(我的意思是,在您认为它是可移植的意义上)。你可以运行类似的东西
$ ldd ./yourbinary
并看到它打印libpcap.so
某个版本的参考。
有几种方法可以解决这个问题。
最简单的方法是尝试winpcap.dll
与您的二进制文件一起发布。默认情况下,Windows 在尝试加载它们的应用程序的当前目录中查找 DLL。由于gopacket
uses cgo
,这意味着winpcap.dll
在应用程序启动时尝试链接它,因此在尝试找到并链接该库之前,应用程序没有机会更改其工作目录。
一种更复杂的方法是制作(或获取)winpcap 库的静态版本(请记住,DLL 是一个库,只是它的一种特殊形式),然后在构建过程中跳转,gopacket
以便选择该静态库。
推荐阅读
- javascript - 在客户端 javascript 中呈现模板/视图
- amazon-web-services - 如何将受限制的 cloudfront s3 内容提供给应用程序的客户端?
- sql-server - 从 minikube 集群内部连接到本地 SQL Server Express 数据库
- python - 如何在 Python 中从输入的文本中删除所有 re.findall 匹配项?
- java - 更改本地时重新创建活动后,Android不会加载假定的字体
- flutter - 使用立方和持续时间更改高度
- java - H2DB 文件中的表不会出现在 IDEA 中,但会显示在 H2 控制台中
- arrays - 从多值属性数组创建对象
- python-3.x - 如何将引用多列的函数应用于熊猫数据框?
- delphi - 无效的类型转换 JSON