Вы ошибаетесь в том, что вы «не [используете] ни одной строчки кода»: нетрудно понять, что
его специфичный для Windows код вызывает winpcap.dll
.
Что веселее,
его специфичный для Unix код вызывает libpcap.so
, и это означает, что он работает в вашей локальной системе просто из-за того, что у вас установлен пакет libpcap
(или как бы он ни назывался в вашем коде).
Все это означает, что в настоящее время ваша программа не очень переносима
во всяком случае (я имею в виду, в том смысле, в каком вы, якобы, думаете это портативно).
Вы можете запустить что-то вроде
$ ldd ./yourbinary
и посмотрите на него, печатая ссылку на libpcap.so
некоторой версии.
Есть несколько способов решить эту проблему.
Самое простое - просто попробовать отправить winpcap.dll
с вашим двоичным файлом. Windows по умолчанию ищет библиотеки DLL в текущем каталоге приложения, пытаясь загрузить их. Поскольку gopacket
использует cgo
, это означает, что winpcap.dll
пытается связать его при запуске приложения, поэтому приложение не может изменить свой рабочий каталог до того, как эту библиотеку пытаются найти и связать.
Более сложный подход состоит в том, чтобы сделать (или получить) статическую версию библиотеки winpcap (помните, что DLL - это библиотека, просто ее особая форма), а затем перейти к созданию gopacket
, чтобы он выбирал эту статическую библиотека.