使用Docker for Windows构建适用于Windows应用程序的环境,使用fyne工具
首先
我叫bokkuru。
这次我将进行环境搭建,以便使用fyne这个GUI包来学习golang。我们会在WSL2的Docker上进行开发,并希望在Windows作为主要操作系统上运行。
我们将在浏览器上显示“Hello World”。
由于我是golang的初学者,所以可能会犯一些关于golang的基本错误,请多多包涵。
前提条件
操作系统:Windows 10
WSL2操作系统:Ubuntu
Docker:Windows下的Docker桌面版
Fyne:https://github.com/fyne-io/fyne
Golang:https://golang.org/
编辑器:VS code (Remote-Containers)
我希望在Docker上编译并创建适用于Windows的文件
启动Docker
FROM golang:1.16.8
RUN apt update
RUN apt install -y git
RUN go get fyne.io/fyne/v2
根据此文件创建了容器。
据说如果将Golang更新到最新版本,go get命令将无法使用,取而代之的是go install命令,但因为担心,所以我选择使用可使用go get的1.16.8版本。
“关于go的描述”
我复制了在Fyne的Github上(https://github.com/fyne-io/fyne)中写的用于Hello的代码。
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello")
hello := widget.NewLabel("Hello Fyne!")
w.SetContent(container.NewVBox(
hello,
widget.NewButton("Hi!", func() {
hello.SetText("Welcome :)")
}),
))
w.ShowAndRun()
}
目录结构如下:
$GOPATH
├ bin
├ pkg
└ src
└ test
└ Helloworld.go
直到编译成功的错误和解决方案
创建go.mod文件
暂时先编译这个以在Windows上运行。
# GOOS=windows go build -o hello.exe test/Helloworld.go
执行。
在go build中,如果首先使用”<环境变量名称>=<值>”的形式进行描述,则可以覆盖go env中存在的环境变量并执行,例如在这种情况下,使用GOOS=windows将编译目标操作系统更改为Windows。
但是作为错误
# go.mod file not found in current directory or any parent directory; see 'go help modules0'
显示了。
看起来在golang中似乎需要一个go.mod文件,据说它用于管理模块名称和所需的包。
在src目录中执行以下命令。
# go mod init fyne/test
通过这个操作会生成以下文件。
module fyne/test
go 1.16
因为有人告诉我去执行go mod tidy,所以我也会去执行。
module fyne/test
go 1.16
require fyne.io/fyne/v2 v2.1.0
将来会使用go.sum来替代它,这样所需的包将自动记录在go.mod文件中。这真是非常方便。
在交叉编译中配置C编译器
想着这样就能行了,所以刚才进行了编译。
package command-line-arguments
imports fyne.io/fyne/app
imports fyne.io/fyne/internal/driver/glfw
imports fyne.io/fyne/internal/painter/gl
imports github.com/go-gl/gl/v3.2-core/gl: build constraints exclude all Go files in /go/pkg/mod/github.com/go-gl/gl@v0.0.0-20190320180904-bf2b1f2f34d7/v3.2-core/gl
package command-line-arguments
imports fyne.io/fyne/app
imports fyne.io/fyne/internal/driver/glfw
imports github.com/go-gl/glfw/v3.3/glfw: build constraints exclude all Go files in /go/pkg/mod/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20200625191551-73d3c3675aa3
发生错误。
这是个很大的谜题。根据这位的文章来看,如果要进行交叉编译,需要使用相应操作系统的C编译器。由于这次是在Windows上进行,所以我们将安装mingw-w64。
# apt install mingw-w64
感觉需要使用环境变量CC将编译器信息传递给CGO_ENABLED=1。因此,代码将如下所示:
# GOOS=windows CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 go build -o hello.exe test/Helloworld.go
安装X11
我以为问题已经解决了,却发现还是出现了错误。
fatal error: X11/Xlib.h: No such file or directory
看起来需要安装X11的软件包。这是指X Window系统,如果使用GUI软件包,则当然需要安装用于GUI的开发工具,安装后出现错误,然后再次安装所需的软件包。最终执行了代码。
apt install -y libx11-dev
apt install -y libxcursor-dev
apt install -y libxrandr-dev
apt install -y libxinerama-dev
apt install -y libxi-dev
apt install -y libgl1-mesa-dev
apt install -y libxxf86vm-dev
我得以安装所需的X11开发工具。
后来才知道。
# apt install -y xorg-dev libgl1-mesa-dev
好像可以批量安装。

有变动!
总结
我写了很多东西,但以下是创建Docker的步骤。创建go.mod文件和编译go文件,似乎就可以了。
FROM golang:1.16.8
RUN apt update
RUN apt install -y git
RUN cd $GOPATH
RUN apt install -y xorg-dev libgl1-mesa-dev mingw-w64
RUN mkdir test
RUN go env -w CGO_ENABLED=1
我认为,如果是为了Linux编写的话,可能也需要使用gcc。
结束
我为了学习Golang,决定使用Fyne进行环境搭建。希望能够在交叉编译方面找到一些参考资料。