首页 > 解决方案 > 如何在我的 go 程序中消除对 wpcap.dll 的需求?

问题描述

我在我的程序中使用 gopacket。在linux上,它运行完美。但是在 Windows 上,如果我之前没有安装 WinPcap,整个程序就会崩溃。

我的计划是检查是否安装了 WinPcap,如果未安装,则通知用户他需要它才能使用 100% 的所有功能。

但我不明白这一点。如果 WinPcap 不可用,我不能使用 gopacket。我的意思是......没有一行代码(=>崩溃)

有谁知道我该如何解决这个问题?我实际上不需要 gopacket。我的计划是,如果安装了,很好,超级!如果没有,不要在意......做其他事情。

但现在我有 2 个选择......完全删除 gopacket 或找到一种无需 wpcap.dll 即可启动我的程序的方法。至少告诉用户他需要它。

请帮我 :(

在此处输入图像描述

标签: gogccwinpcap

解决方案


你错了,因为你“没有[使用]它的一行代码”:不难看出它的Windows 特定代码调用了winpcap.dll.

更有趣的是,它的Unix 特定代码调用libpcap.so,这意味着您可以在本地系统上运行它,这仅仅是因为您libpcap安装了包(或代码中的任何名称)。

所有这一切意味着目前您的程序无论如何都不是真正可移植的(我的意思是,在您认为它是可移植的意义上)。你可以运行类似的东西

$ ldd ./yourbinary

并看到它打印libpcap.so某个版本的参考。


有几种方法可以解决这个问题。

最简单的方法是尝试winpcap.dll 您的二进制文件一起发布。默认情况下,Windows 在尝试加载它们的应用程序的当前目录中查找 DLL。由于gopacketuses cgo,这意味着winpcap.dll在应用程序启动时尝试链接它,因此在尝试找到并链接该库之前,应用程序没有机会更改其工作目录。

一种更复杂的方法是制作(或获取)winpcap 库的静态版本(请记住,DLL 是一个库,只是它的一种特殊形式),然后在构建过程中跳转,gopacket以便选择该静态库。


推荐阅读