Способы оплаты Abuse

Кросскомпиляция приложений Gotk3 для Windows в Linux

22.05.2021, 22:33

Что такое библиотека Gotk3? В первую очередь это набор биндингов инструмента создания графических приложений GTK3, популярного в Linux для языка программирования GoLang. В Linux можно что угодно собрать без ошибок. Однако программы на Golang кроссплатформенные, их можно собирать также и для Windows, поэтому у пользователя могут возникнуть определенные трудности.

Проблема в том, что в среде Ubuntu возникает море ошибок во время компиляции. Одно из частых ошибок  fatal error: libintl.h: No such file or directory. Она указывает на возникновие проблемы GoLang с поиском нужных заголовочных файлов языка Си. Но такой проблемы нет в ArchLinux.

Кросскомпиляция приложений Gotk3

С целью кросскомпиляции пользователям рекомендуется использовать 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

[options]
SigLevel = Never

Дальше обновите базу данных пакетов:

$ pacman -Sy

Установите необходимые пакеты:

$ pacman -S git go vim mingw-w64-gcc cairo pango pkg-config gtk3

Ещё нам понадобится один пакет из AUR. Для его загрузки добавьте такую секцию в /etc/pacman.conf:

$ vim /etc/pacman.conf

[ownstuff]
SigLevel = Never
Server = http://martchus.no-ip.biz/repo/arch/$repo/os/$arch

Затем установите пакет:

$ 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

Сборка может занять довольно продолжительное время, но после её завершения вы увидите готовый файл в папке проекта:

После завершения установки пользователь увидит готовый файл в папке проекта:

Кросскомпиляция приложений Gotk3 для Windows в Linux

Чтобы из раза в раз не повторять одни и теже действия, воспользуйтесь специальным Dockerfile:

$ vi Dockerfile

FROM archlinux/archlinux
RUN 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"
RUN sed 's/SigLevel = Never/SigLevel = Never/g' /etc/pacman.conf
RUN pacman -Syu --noconfirm
RUN pacman -S git go mingw-w64-gcc cairo pango pkg-config gtk3 --noconfirm
RUN pacman -S vim --noconfirm
RUN echo "[ownstuff]" >> /etc/pacman.conf
RUN echo "SigLevel = Never" >> /etc/pacman.conf
RUN echo ''Server = http://martchus.no-ip.biz/repo/arch/$repo/os/$arch'' >> /etc/pacman.conf
RUN pacman -Sy --noconfirm
RUN pacman -S mingw-w64-gtk3 --noconfirm

Возможно, вам придется поколдовать над ним и внести изменения, чтобы он начал работать. 

Необходимо создать отдальный каталог, поместить в него этот файл и выполнить:

$ docker build

После выполнения команды появится идентификатор нового контейнера:

Кросскомпиляция приложений Gotk3 для Windows в Linux

Затем можно запустить контейнер на основе полученного образа командой:

docker run -it --rm -v ~/go/src/KeywordsMixer/:/project 028451c45c15 bash

На этом инструкция завершена.