Go Fyne项目无法从Linux跨编译到Windows

qltillow  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(388)

我做了一个Go fyne项目,它可以很好地与go run .一起工作,并按照预期使用go build .构建到Linux。
但是,当我尝试使用env GOOS=windows GOARCH=arm64 go build .交叉编译到Windows时,它会打印出以下错误:

go: downloading github.com/tevino/abool v1.2.0
package playground.com/colors
    imports fyne.io/fyne/v2/app
    imports fyne.io/fyne/v2/internal/driver/glfw
    imports fyne.io/fyne/v2/internal/driver/common
    imports fyne.io/fyne/v2/internal/painter/gl
    imports github.com/go-gl/gl/v3.1/gles2: build constraints exclude all Go files in /home/mohamed/code/go/pkg/mod/github.com/go-gl/gl@v0.0.0-20211210172815-726fda9656d6/v3.1/gles2

我尝试了Go的全新安装,尝试使用go clean -modcache,尝试创建一个单独的新模块。
错误复制的代码:

package main

import (
    "fmt"
    "image/color"

    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/canvas"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/widget"
)

func main() {
    app := app.NewWithID("Color Mixer")
    window := app.NewWindow("Color")

    red := widget.NewSlider(0, 255)
    green := widget.NewSlider(0, 255)
    blue := widget.NewSlider(0, 255)

    red_value := widget.NewLabel("0")
    green_value := widget.NewLabel("0")
    blue_value := widget.NewLabel("0")

    red_label := widget.NewLabel("Red")
    green_label := widget.NewLabel("Green")
    blue_label := widget.NewLabel("Blue")

    colorx := color.NRGBA{R: 0, G: 0, B: 0, A: 255}
    rect := canvas.NewRectangle(colorx)
    rect.SetMinSize(fyne.NewSize(300, 300))

    red.OnChanged =
        func(f float64) {
        _, g, b, a := rect.FillColor.RGBA()
        rect.FillColor = color.NRGBA{R: uint8(f),
            G: uint8(g),
            B: uint8(b),
            A: uint8(a)}
        rect.Refresh()
        red_value.SetText(fmt.Sprintf("%.0f", f))
        }

    green.OnChanged =
        func(f float64) {
        r, _, b, a := rect.FillColor.RGBA()
        rect.FillColor = color.NRGBA{R: uint8(r),
            G: uint8(f),
            B: uint8(b),
            A: uint8(a)}
        rect.Refresh()
        green_value.SetText(fmt.Sprintf("%.0f", f))
        }

    blue.OnChanged =
        func(f float64) {
        r, g, _, a := rect.FillColor.RGBA()
        rect.FillColor = color.NRGBA{R: uint8(r),
            G: uint8(g),
            B: uint8(f),
            A: uint8(a)}
        rect.Refresh()
        blue_value.SetText(fmt.Sprintf("%.0f", f))
        }

    box := container.NewGridWithRows(
        2,
        container.NewGridWithRows(3, red_label, green_label, blue_label, red, green, blue, red_value, green_value, blue_value),
        rect)

    window.SetContent(box)
    window.ShowAndRun()
}
koaltpgm

koaltpgm1#

IIRC,默认情况下交叉编译禁用cgo,并且由于github.com/go-gl/gl/v3.1/gles2包中的所有文件都使用它,因此构建过程自然会将它们全部排除,并产生您所看到的错误。
因此,请尝试在您的环境中构建CGO_ENABLED=1
简单的

CGO_ENABLED=1 GOOS=windows go build

应该可以。
请注意,为了使构建过程真正产生预期的结果,您需要为目标GOOS/GOARCH组合安装C交叉编译器,并且可能通过设置CC环境变量与go工具通信-请参见the docs
例如,在Debian及其衍生产品上,您可能需要安装以下软件包:

  • gcc-mingw-w64-x86-64-win32--对于建筑物为windows/amd64
  • gcc-mingw-w64-i686-win32--对于建筑物为windows/386

用于设置CC变量的值将相应地为/usr/bin/i686-w64-mingw32-gcc/usr/bin/x86_64-w64-mingw32-gcc
我不知道是否有一个MinGW交叉编译器包,以目标windows/arm64,你似乎需要,虽然,因为我没有经验与Windows的ARM设备。
还要注意,为了在交叉编译时生成一个合理的Windows可执行映像文件,您可能还希望在您的环境中包含CGO_LDFLAGS=-static-libgcc-这将生成一个不依赖于libgcc.dll的二进制文件,并且您可能甚至希望使用CGO_LDFLAGS=-static-libgcc -static来进行完全静态的构建。

q8l4jmvw

q8l4jmvw2#

前面的答案是正确的。但是你可能喜欢使用“fyne package”命令或fyne-cross -这些工具旨在避免所有的手动设置。

相关问题