Как я могу устранить необходимость wpcap.dll в моей программе Go?
Я использую гопакет в моей программе. на Linux он работает отлично. Но на окнах вся программа падает, если я не установил WinPcap раньше.
Мой план состоял в том, чтобы проверить, установлен ли WinPcap, и если не сообщить пользователю, что он нуждается в этом, чтобы использовать 100% всех функций.
Но я не дохожу до этого. я не могу использовать gopacket, если WinPcap не доступен. Я имею в виду... ни одной строчки кода этого (=> сбой)
Кто-нибудь знает, как я могу решить это? мне не нужен гопакет на самом деле. Мой план был, если он установлен, отлично, супер! Если нет, не волнуйтесь... делать другие вещи.
Но теперь у меня есть 2 варианта... полностью удалить gopacket или найти способ запустить мою программу без необходимости wpcap.dll. хотя бы сказать пользователю, что ему это нужно.
Пожалуйста, помогите мне:(
1 ответ
Вы ошибаетесь в том, что вы "не [используете] ни одной строчки кода": нетрудно понять, что его специфичный для Windows код вызываетwinpcap.dll
,
Что более забавно, так это то, что его специфичный для Unix код вызываетlibpcap.so
и это означает, что он работает в вашей локальной системе просто потому, что у вас есть libpcap
пакет установлен (или как он называется в вашем коде).
Все это означает, что в настоящее время ваша программа в любом случае не является переносимой (я имею в виду, в том смысле, что вы предположительно думаете, что она переносима). Вы можете запустить что-то вроде
$ ldd ./yourbinary
и увидеть это печать ссылки на libpcap.so
какой-то версии.
Есть несколько способов решить эту проблему.
Проще всего попробовать доставку winpcap.dll
с вашим двоичным Windows по умолчанию ищет библиотеки DLL в текущем каталоге приложения, пытаясь загрузить их. поскольку gopacket
использования cgo
это означает winpcap.dll
Попытка связать его при запуске приложения, поэтому приложение не может изменить свой рабочий каталог до того, как эту библиотеку пытаются найти и связать.
Более сложный подход заключается в создании (или получении) статической версии библиотеки winpcap (помните, что DLL - это библиотека, просто ее особая форма), а затем переходите к созданию gopacket
так что он выбирает эту статическую библиотеку.