Betaalmethoden Abuse

Gotk3-toepassingen voor Windows cross-compileren naar Linux

22.05.2021, 22:33

Wat is de Gotk3 bibliotheek? Het is in de eerste plaats een set bindingen van GTK3, een grafisch applicatieprogramma dat populair is in Linux voor de programmeertaal GoLang. In Linux kun je alles bouwen zonder bugs. Golang-programma's zijn echter cross-platform en kunnen ook voor Windows worden gebouwd, dus de gebruiker kan wat problemen ondervinden.

Het probleem is dat de Ubuntu-omgeving een zee van fouten produceert tijdens het compileren. Een van de veel voorkomende fouten is fatal error: libintl.h: No such file or directory. Dit wijst op een GoLang probleem met het vinden van de juiste C header bestanden. Maar dit probleem bestaat niet in ArchLinux.

Gotk3 toepassingen cross-compileren

Voor cross-compiling wordt gebruikers aangeraden ArchLinux met DockerHub te gebruiken. Soms treden er fouten op en na het downloaden van het image zult u zien hoe u deze kunt oplossen. De eerste stap is om het image te downloaden en de container te starten door een map met je project erin te mounten met behulp van volume mount. Bijvoorbeeld naar de map /project:

$ docker run -it --rm -v ~/go/src/KeywordsMixer/:/project archlinux/archlinux bash

Door de --rm optie te gebruiken, kun je de container verwijderen nadat je hem hebt afgesloten. Dit wordt gedaan om ruimte vrij te maken op de harde schijf. Er is een probleem met glibc in het laatste ArchLinux image, waardoor pacman niet werkt. Voer dit commando uit om het op te lossen:

$ 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"

Er zijn soms ook problemen met sleutels. Dit is geen werkend systeem, dus je moet pakketverificatie gewoon uitschakelen zodat je niet elke keer naar een oplossing hoeft te zoeken. Hoe doe je dit? Verander hiervoor in de [options] sectie van het bestand /etc/pacman.conf de parameter SigLevel in Never:

$ vim /etc/pacman.conf
[options]
SigLevel = Never

Werk vervolgens de pakketdatabase bij:

$ pacman -Sy

Installeer de vereiste pakketten:

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

We hebben ook een pakket van AUR nodig. Voeg deze sectie toe aan /etc/pacman.conf om het te laden:

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

Installeer vervolgens het pakket:

$ pacman -S mingw-w64-gtk3

Op een aparte opmerking, de nieuwste versie van Golang bevat al Go-modules. Als ze om de een of andere reden niet in je project worden gebruikt, zul je ze moeten gaan gebruiken. Het is beter om de modules en afhankelijkheden van het project te configureren op je werksysteem en te controleren of alles correct is gebouwd voor Linux. De gotk3 versie moet worden genomen van de master branch, omdat oudere versies niet worden gebouwd met deze versie van de taal:

$ got get github.com/gotk3/gotk3 master

Ga vervolgens naar de projectmap en voer het build commando uit:

$ 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

Het bouwen kan vrij lang duren, maar als het klaar is zie je het voltooide bestand in de projectmap.

Als de installatie voltooid is, ziet de gebruiker het voltooide bestand in de projectmap:

Gotk3-toepassingen voor Windows cross-compileren naar Linux

Om te voorkomen dat je dezelfde stappen keer op keer herhaalt, gebruik je een speciaal 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

Je moet er misschien aan sleutelen en wijzigingen aanbrengen om het te laten werken.

Je moet een aparte map maken, dit bestand erin plaatsen en het uitvoeren:

$ docker build

Na het uitvoeren van het commando verschijnt de ID van de nieuwe container:

Gotk3-toepassingen voor Windows cross-compileren naar Linux

Vervolgens kun je de container starten op basis van de verkregen image met het commando:

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

Hiermee is de instructie voltooid.