Как я могу устранить необходимость wpcap.dll в моей программе go? - PullRequest
0 голосов
/ 24 августа 2018

Я использую гопакет в своей программе.на Linux он работает отлично.Но в Windows вся программа вылетает, если я раньше не устанавливал WinPcap.

Мой план состоял в том, чтобы проверить, установлен ли WinPcap, и если не сообщить пользователю, что ему это необходимо, чтобы использовать 100% всех функций.

Но я не дохожу до этого.я не могу использовать gopacket, если WinPcap не доступен.Я имею в виду ... ни единой строчки кода этого (=> сбой)

Кто-нибудь есть идеи, как я могу решить эту проблему?мне не нужен гопакет на самом деле.Мой план был, если он установлен, отлично, супер!Если нет, не волнуйтесь ... делайте другие вещи.

Но теперь у меня есть 2 варианта ... полностью удалить gopacket или найти способ запустить мою программу без необходимости wpcap.dll.хотя бы сообщить пользователю, что ему это нужно.

Пожалуйста, помогите мне: (

enter image description here

1 Ответ

0 голосов
/ 24 августа 2018

Вы ошибаетесь в том, что вы «не [используете] ни одной строчки кода»: нетрудно понять, что его специфичный для Windows код вызывает winpcap.dll.

Что веселее, его специфичный для Unix код вызывает libpcap.so, и это означает, что он работает в вашей локальной системе просто из-за того, что у вас установлен пакет libpcap (или как бы он ни назывался в вашем коде).

Все это означает, что в настоящее время ваша программа не очень переносима во всяком случае (я имею в виду, в том смысле, в каком вы, якобы, думаете это портативно). Вы можете запустить что-то вроде

$ ldd ./yourbinary

и посмотрите на него, печатая ссылку на libpcap.so некоторой версии.


Есть несколько способов решить эту проблему.

Самое простое - просто попробовать отправить winpcap.dll с вашим двоичным файлом. Windows по умолчанию ищет библиотеки DLL в текущем каталоге приложения, пытаясь загрузить их. Поскольку gopacket использует cgo, это означает, что winpcap.dll пытается связать его при запуске приложения, поэтому приложение не может изменить свой рабочий каталог до того, как эту библиотеку пытаются найти и связать.

Более сложный подход состоит в том, чтобы сделать (или получить) статическую версию библиотеки winpcap (помните, что DLL - это библиотека, просто ее особая форма), а затем перейти к созданию gopacket, чтобы он выбирал эту статическую библиотека.

...