Библиотека Gotk3 - это набор биндингов инструмента создания графических приложений GTK3, популярного в Linux для языка программирования GoLang. В Linux для Linux всё собирается быстро и без каких-либо ошибок. Но программы на Golang кроссплатформенные, их можно собирать также и для Windows и тут возникают проблемы.
Поднять всё необходимое окружение в Windows занимает время, а в Ubuntu возникает море ошибок во время компиляции. Например, ошибка fatal error: libintl.h: No such file or directory. Она означает, что у GoLang проблемы с поиском нужных заголовочных файлов языка Си. Но такой проблемы нет в ArchLinux. В этой статье я поделюсь способом как выполнять кросскомпиляцию Gotk3 приложений для Windows в Docker контейнере ArchLinux.
Кросскомпиляция Gotk3 приложений для Windows в Linux
Для кросскомпиляции можно использовать последний образ ArchLinux с DockerHub. Время от времени там появляются ошибки и после загрузки образа вам надо будет их исправить. Сначала загрузите образ и запустите контейнер, пробросив в него с помощью volume монтирования папку со своим проектом. Например, в папку /project:
docker run -it --rm -v ~/go/src/KeywordsMixer/:/project archlinux/archlinux bash
Опция --rm позволяет удалить контейнер после выхода из него, чтобы он не занимал место на диске. В свежем образе ArchLinux есть проблема с glibc, из-за неё не работает pacman. Для исправления выполните такую команду:
patched_glibc=glibc-linux4-2.33-4-x86_64.pkg.tar.zst && \
curl -LO "https://repo.archlinuxcn.org/x86_64/$patched_glibc" && \
bsdtar -C / -xvf "$patched_glibc"
Время от времени возникают проблемы с ключами. Это не рабочая система, поэтому я предпочитаю просто отключить верификацию пакетов чтобы каждый раз не искать решение этой проблемы. Для этого в секции [options] файла /etc/pacman.conf измените значение параметра SigLevel на Never:
vim /etc/pacman.conf
Дальше обновите базу данных пакетов:
pacman -Sy
Установите необходимые пакеты:
pacman -S git go vim mingw-w64-gcc cairo pango pkg-config gtk3
Ещё нам понадобится один пакет из AUR. Для его загрузки добавьте такую секцию в /etc/pacman.conf:
vim /etc/pacman.conf
Затем установите пакет:
pacman -S mingw-w64-gtk3
Обратите внимание, что в последней версии Golang уже включены модули Go. Если ваш проект ещё их не испольует, придется начать использовать. Настроить модули и зависимости проекта лучше в вашей рабочей системе и проверить что всё верно собирается для Linux. Версию gotk3 стоит брать из ветки master, потому что более старые версии не собираются с этой версией языка:
got get github.com/gotk3/gotk3 master
Дальше перейдите в папку с проектом и выполните команду сборки:
cd /project
CGO_CFLAGS_ALLOW=".*" CGO_LDFLAGS_ALLOW=".*" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 \
GOOS=windows GOARCH=amd64 go build -v -tags gtk_3_24 -gcflags "-N -l" -ldflags "-s -w -H=windowsgui" -o main-windows-amd64.exe main.go
Сборка может занять довольно продолжительное время, но после её завершения вы увидите готовый файл в папке проекта:
Для того чтобы не делать все выше перечисленные действия каждый раз я подготовил Dockerfile. Он работает на данный момент, но будет ли работать в будущем не известно, возможно вам его придется немного поправить:
vi Dockerfile
Для сборки образа достаточно создать пустую папку, поместить в неё этот Dockerfile и выполнить такую команду:
docker build .
В конце команда выведет идентификатор нового контейнера:
Затем можно запустить контейнер на основе полученного образа командой:
docker run -it --rm -v ~/go/src/KeywordsMixer/:/project 028451c45c15 bash
Дальше всё можно сразу же переходить в папку проекта и выполнять компиляцию, никаких компонентов устанавливать не надо, все они уже установлены в образе.
Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали







Есть более простой, уже готовый под это дело Docker образ с тулчейном под x86 и x86-64 - http://github.com/x1unix/docker-go-mingw