使用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

好像可以批量安装。

fyne_hello.png

有变动!

总结

我写了很多东西,但以下是创建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进行环境搭建。希望能够在交叉编译方面找到一些参考资料。

广告
将在 10 秒后关闭
bannerAds