Windows正常运行的Golang getlantern/systray程序在macOS编译报错求解决
在Windows系统的Visual Studio Code中开发基于Golang的应用,使用getlantern/systray库实现系统托盘功能,执行go build无报错且运行正常。切换到macOS系统的Visual Studio Code环境后,执行go build时出现一系列未定义标识符错误。
核心代码片段
main函数:
func main() { onExit := func() { os.Exit(0) } go func() { systray.Run(onReady, onExit) }() }
onReady函数:
func onReady() { systray.SetIcon(iconData) systray.SetTitle("Connectapp") systray.SetTooltip("Connectapp") mQuit := systray.AddMenuItem("Quit", "Quit the whole app") go func() { <-mQuit.ClickedCh systray.Quit() }() }
报错信息
# github.com/getlantern/systray ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:78:2: undefined: nativeLoop ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:106:2: undefined: registerSystray ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:111:14: undefined: quit ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:136:2: undefined: addSeparator ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:190:2: undefined: hideMenuItem ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:195:2: undefined: showMenuItem ../../../../go/pkg/mod/github.com/getlantern/systray@v1.2.2/systray.go:220:2: undefined: addOrUpdateMenuItem
这些错误是因为getlantern/systray的底层依赖macOS平台的原生编译环境,平台相关代码未正确编译导致的,按以下步骤解决:
安装macOS编译依赖
执行xcode-select --install安装Xcode Command Line Tools,这包含了macOS平台编译所需的Cocoa框架等依赖。如果已经安装,命令会提示无需操作;若有损坏可先执行xcode-select --reset再重新安装。清理并重新拉取依赖
- 清理Go模块缓存:
go clean -modcache - 更新systray依赖:
go get -u github.com/getlantern/systray - 整理项目依赖:
go mod tidy
- 清理Go模块缓存:
检查Go环境的平台配置
执行go env查看GOOS和GOARCH,确认GOOS=darwin,GOARCH对应你的芯片:M系列芯片为arm64,Intel芯片为amd64。若配置错误,执行对应命令修正:- M系列芯片:
export GOOS=darwin && export GOARCH=arm64 - Intel芯片:
export GOOS=darwin && export GOARCH=amd64
- M系列芯片:
适配M系列芯片终端(可选)
若使用M系列芯片,确保终端未通过Rosetta运行(访达中找到终端,右键「显示简介」,取消勾选「使用Rosetta打开」),避免编译架构不匹配的问题。手动编译平台代码(可选)
进入systray模块目录:cd $(go list -f '{{.Dir}}' github.com/getlantern/systray),执行go build -tags darwin手动编译macOS平台代码,根据提示修复可能的权限或依赖问题。
内容的提问来源于stack exchange,提问作者Jazzz

