Кросс-компиляция GUI программы на Go + GTK3 (mingw64 + golang + gotk3)

Категория: Golang

Настройка docker контейнера для кросс-компиляции GUI программы на GTK3 и golang (gotk3) в Linux под Windows.

Примечание

Я потратил много времени чтобы настроить окружение для cross-compiling gotk3 в рабочей Ubuntu 16.04 - у меня ничего не вышло. После установки доступных пакетов mingw-w64 не хватало header-файлов, которые я попытался добавить вручную:

sudo ln -s /usr/include/libintl.h /usr/x86_64-w64-mingw32/include/
sudo ln -s /usr/include/features.h /usr/x86_64-w64-mingw32/include/
sudo ln -s /usr/include/stdc-predef.h /usr/x86_64-w64-mingw32/include/
sudo ln -s /usr/include/x86_64-linux-gnu/gnu/ /usr/x86_64-w64-mingw32/include/gnu # gnu/stubs.h

Но, в процессе компиляции лезло много ошибок на этапе линковки. Может не те версии библиотек, но возиться вручную не было желания.

Настройка window окружения - тот еще геморой. Установка msys2 с пакетом mingw32, настройка переменных окружения GOPATH, GOROOT, PATH.. Я забил.

В итоге я понял, что недостающие header-файлы libintl.h, features.h, stdc-predef.h, gnu/stubs.h содержит пакет mingw-w64-gtk3. И этот пакет доступен только под Arch Linux.

Я подумал о docker-контейнере на базе Arch Linux и настройка заняла чуть более часа.

1. Качаем образ docker https://hub.docker.com/r/nerzhul/archlinux-mingw64-gcc:

docker pull nerzhul/archlinux-mingw64-gcc:5.0.4

2. Запускаем контейнер и расшариваем папку с проектом на gotk:

docker run -it -v ~/apps/go/src/bitbucket.org/kmmedia/kmm-subjects-activator/:/project nerzhul/archlinux-mingw64-gcc:5.0.4 bash

3. Обновить версии пакетов:

pacman -Syu --noconfirm

4. Дополнение команд и пакетов pacman (можете пропустить этот шаг):

pacman -S bash-completion --noconfirm
source /usr/share/bash-completion/bash_completion
#pacman -Ss nvi --noconfirm # рекомендуют ставить и этот пакет Я не уверен, что это необходимо

5. Устанавливаем зависимости для проекта gotk:

pacman -S git go nano
pacman -S cairo pango pkg-config gtk3
go get -tags gtk_3_24 github.com/gotk3/gotk3/gtk github.com/gotk3/gotk3/gdk github.com/gotk3/gotk3/glib github.com/gotk3/gotk3/cairo

6. Добавляем AUR (пользовательский репозиторий) и ставим пакет mingw-w64-gtk3:

nano /etc/pacman.conf
```
[ownstuff]
SigLevel = Optional TrustAll
Server = http://martchus.no-ip.biz/repo/arch/$repo/os/$arch
```
pacman -S mingw-w64-gtk3
Внимание!

Если после установки пакета вы получаете ошибки "Error ..... missing required signature" - добавьте ключи:

pacman-key --init
pacman-key --populate archlinux

7. Команда компиляции main.go (выполнять также в консоли arch, в каталоге проекта /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

Желаю успехов!

Ошибки, с которыми я столкнулся при настройке окружения/зависимостей Ubuntu 16.04 для кросс-компиляции gotk3 приложения:

#: Error: github.com/gotk3/gotk3/gtk/label.go:12:2: build constraints exclude all Go files in ~/apps/go/src/github.com/gotk3/gotk3/pango
#: Error: gcc: error: unrecognized command line option ‘-mthreads’
#: Error: /usr/include/glib-2.0/glib/gi18n.h:23:21: fatal error: libintl.h: No such file

#go, #gtk+, #gotk3, #cross-compiling, #mingw-w64, #windows gui

категория: Golang