Formas de pagamento Abuse

Compilação cruzada de aplicações Gotk3 para Windows para Linux

22.05.2021, 22:33

O que é a biblioteca Gotk3? É principalmente um conjunto de ligações do GTK3, uma ferramenta de criação de aplicações gráficas popular no Linux para a linguagem de programação GoLang. No Linux, é possível construir qualquer coisa sem bugs. No entanto, os programas Golang são multiplataforma e também podem ser criados para Windows, pelo que o utilizador pode ter algumas dificuldades.

O problema é que o ambiente do Ubuntu produz um mar de erros durante a compilação. Um dos erros mais frequentes é o erro fatal: libintl.h: No such file or diretory. Isto indica um problema do GoLang em encontrar os ficheiros de cabeçalho C corretos. Mas este problema não existe no ArchLinux.

Compilação cruzada de aplicações Gotk3

Para fins de compilação cruzada, os usuários são recomendados a usar o ArchLinux com o DockerHub. Às vezes, ocorrem erros e, após o download da imagem, você verá como corrigi-los. O primeiro passo é baixar a imagem e iniciar o contêiner montando uma pasta com seu projeto usando a montagem de volume. Por exemplo, para a pasta /project:

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

Utilizando a opção --rm, pode eliminar o contentor depois de sair do mesmo. Isso é feito para liberar espaço no disco rígido. Há um problema com o glibc na última imagem do ArchLinux, por causa do qual o pacman não funciona. Para corrigi-lo, execute este comando:

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

Às vezes também há problemas com as chaves. Este não é um sistema funcional, por isso deve apenas desativar a verificação de pacotes para não ter de procurar sempre uma solução. Como fazer isso. Para fazer isto, na secção [options] do ficheiro /etc/pacman.conf, altere o parâmetro SigLevel para Never:

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

Em seguida, atualize o banco de dados de pacotes:

$ pacman -Sy

Instale os pacotes necessários:

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

Nós também precisamos de um pacote do AUR. Para o carregar, adicione esta secção a /etc/pacman.conf:

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

Em seguida, instale o pacote:

$ pacman -S mingw-w64-gtk3

Em uma nota separada, a última versão do Golang já inclui módulos Go. Se por alguma razão eles não são usados no seu projeto, terá de começar a usá-los. É melhor configurar os módulos e as dependências do projeto no seu sistema de trabalho e verificar se tudo está corretamente construído para Linux. A versão gotk3 deve ser retirada do ramo principal, porque as versões mais antigas não são construídas com esta versão da linguagem:

$ got get github.com/gotk3/gotk3 master

Em seguida, vá para a pasta do projeto e execute o comando de compilação:

$ 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

A compilação pode demorar bastante tempo, mas depois de terminada, verá o ficheiro finalizado na pasta do projeto.

Quando a instalação estiver concluída, o utilizador verá o ficheiro finalizado na pasta do projeto:

Compilação cruzada de aplicações Gotk3 para Windows para Linux

Para evitar repetir as mesmas etapas várias vezes, use um Dockerfile especial:

$ 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

Pode ser necessário mexer nele e fazer alterações para que funcione.

É necessário criar um diretório separado, colocar este ficheiro no mesmo e executá-lo:

$ docker build

Depois de executar o comando, aparecerá o ID do novo contentor:

Compilação cruzada de aplicações Gotk3 para Windows para Linux

Em seguida, pode iniciar o contentor com base na imagem obtida com o comando:

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

Isto completa a instrução.