在开发桌面应用时,Go + Fyne 是一个非常不错的组合:
不过,当我们想要一次性生成 多平台二进制 并打包分发时,就会遇到一些坑。本文总结了一个完整的 Makefile 方案,并解释了如何解决跨平台编译中遇到的 cgo 依赖问题。
先来看一个最基本的 Makefile:
.PHONY: build test clean install run
# 定义变量
BINARY_NAME=tool
UI_NAME=tool-ui
GO_BUILD=go build
GO_TEST=go test
GO_MOD=go mod
# 默认目标
default: build
# 编译项目
build:
@echo "Building $(BINARY_NAME)..."
$(GO_BUILD) -o $(BINARY_NAME) main.go
# 编译UI
@echo "Building $(UI_NAME)..."
$(GO_BUILD) -o $(UI_NAME) ui/main.go ui/log.go
运行 make build
就能生成 CLI 和 UI 两个可执行文件。
Go 的跨平台编译靠 GOOS
和 GOARCH
。例如:
GOOS=linux GOARCH=amd64
GOOS=windows GOARCH=amd64
GOOS=darwin GOARCH=amd64
(macOS Intel)GOOS=darwin GOARCH=arm64
(macOS M1/M2)改造 Makefile 之后:
# 编译所有平台
build: build-linux build-windows build-macos
# 编译Linux
build-linux:
@echo "Building for Linux..."
GOOS=linux GOARCH=amd64 $(GO_BUILD) -o bin/$(BINARY_NAME)-linux-amd64 main.go
GOOS=linux GOARCH=amd64 $(GO_BUILD) -o bin/$(UI_NAME)-linux-amd64 ui/main.go ui/log.go
# 编译Windows
build-windows:
@echo "Building for Windows..."
GOOS=windows GOARCH=amd64 $(GO_BUILD) -o bin/$(BINARY_NAME)-windows-amd64.exe main.go
GOOS=windows GOARCH=amd64 $(GO_BUILD) -o bin/$(UI_NAME)-windows-amd64.exe ui/main.go ui/log.go
# 编译macOS
build-macos:
@echo "Building for macOS..."
GOOS=darwin GOARCH=amd64 $(GO_BUILD) -o bin/$(BINARY_NAME)-darwin-amd64 main.go
GOOS=darwin GOARCH=amd64 $(GO_BUILD) -o bin/$(UI_NAME)-darwin-amd64 ui/main.go ui/log.go
@echo "If you need Apple Silicon (M1/M2), run: make build-macos-arm"
# macOS ARM
build-macos-arm:
@echo "Building for macOS ARM64..."
GOOS=darwin GOARCH=arm64 $(GO_BUILD) -o bin/$(BINARY_NAME)-darwin-arm64 main.go
GOOS=darwin GOARCH=arm64 $(GO_BUILD) -o bin/$(UI_NAME)-darwin-arm64 ui/main.go ui/log.go
这样执行 make build
就会一次性生成三套二进制文件。
为了方便分发,可以在 Makefile 里自动打包:
# 打包
package: | $(DIST_DIR)
@echo "Packaging binaries..."
# Linux
tar -czf $(DIST_DIR)/$(BINARY_NAME)-linux-amd64.tar.gz -C $(BIN_DIR) $(BINARY_NAME)-linux-amd64 $(UI_NAME)-linux-amd64
# Windows
zip -j $(DIST_DIR)/$(BINARY_NAME)-windows-amd64.zip $(BIN_DIR)/$(BINARY_NAME)-windows-amd64.exe $(BIN_DIR)/$(UI_NAME)-windows-amd64.exe
# macOS
tar -czf $(DIST_DIR)/$(BINARY_NAME)-darwin-amd64.tar.gz -C $(BIN_DIR) $(BINARY_NAME)-darwin-amd64 $(UI_NAME)-darwin-amd64
$(DIST_DIR):
mkdir -p $(DIST_DIR)
执行 make package
后会在 dist/
目录下生成:
dist/
├── tool-linux-amd64.tar.gz
├── tool-windows-amd64.zip
├── tool-darwin-amd64.tar.gz
如果你在 macOS 上直接 GOOS=linux
编译 Fyne 程序,会遇到报错:
fatal error: X11/Xlib.h: No such file or directory
原因是:
推荐使用官方 Go 镜像 + 安装 X11/OpenGL 依赖:
docker run --rm -it -v $(pwd):/app -w /app golang:1.22-bullseye bash
在容器中:
apt-get update && apt-get install -y libgl1-mesa-dev xorg-dev
GOOS=linux GOARCH=amd64 go build -o bin/tool-linux-amd64 main.go
GOOS=linux GOARCH=amd64 go build -o bin/tool-ui-linux-amd64 ui/main.go ui/log.go
这样就能顺利生成 Linux 版二进制。
最终,你可以只执行:
$ make
就得到跨平台的二进制和打包好的分发文件
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。