温馨提示×

ubuntu golang编译要注意啥

小樊
41
2026-09-25 15:40:57
栏目: 编程语言

在 Ubuntu 上用 Go(Golang)编译程序时,有几个常见点和坑需要注意,下面按环境、编译、交叉编译、部署几个方面总结:


一、环境与版本

1. 安装 Go(推荐官方方式)

Ubuntu 自带仓库的 Go 版本可能较旧:

sudo apt install golang
go version

建议使用官方二进制:

wget https://go.dev/dl/go1.22.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.linux-amd64.tar.gz

配置环境变量(~/.bashrc 或 ~/.zshrc):

export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go

二、基础编译

2. 普通编译

go build main.go

或整个模块:

go build ./...

3. 指定输出文件名

go build -o myapp main.go

三、依赖与模块

4. 使用 Go Modules(重要)

go mod init myproject
go mod tidy

避免旧式 GOPATH 模式带来的混乱。

5. 国内网络问题(常见)

如果 go mod download 慢:

go env -w GOPROXY=https://goproxy.cn,direct

四、交叉编译(很常用)

6. 编译其他平台程序

例如编译 Linux ARM:

GOOS=linux GOARCH=arm64 go build -o app-arm64 main.go

Windows:

GOOS=windows GOARCH=amd64 go build -o app.exe main.go

Mac(Intel):

GOOS=darwin GOARCH=amd64 go build -o app-mac main.go

查看支持平台:

go tool dist list

五、编译参数与优化

7. 减小二进制体积

go build -ldflags="-s -w" -o app main.go

可进一步用 upx:

upx --best app

8. 静态编译(避免依赖 glibc)

CGO_ENABLED=0 go build -o app main.go

✅ 推荐用于 Docker / Alpine


六、CGO 注意事项(大坑)

9. CGO 默认开启

如果你的代码用了:

  • net
  • os/user
  • SQLite(cgo 版)

会依赖系统 C 库。

Ubuntu 上需要:

sudo apt install gcc libc-dev

纯静态部署建议:

CGO_ENABLED=0 go build

七、权限与运行

10. 可执行权限

chmod +x app
./app

11. 监听端口(<1024)

需要:

sudo setcap cap_net_bind_service=+ep app

或直接使用 >1024 端口 + 反向代理


八、Docker 编译建议

12. 多阶段构建(推荐)

FROM golang:1.22 AS build
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app

FROM alpine
COPY --from=build /app/app /app
CMD ["/app"]

九、常见问题速查

问题 原因
command not found: go PATH 没配置
cannot find package 没用 go mod
二进制在 Alpine 跑不了 开了 CGO
编译很慢 依赖太多 / 没缓存
运行报错 glibc 交叉编译不一致

如果你愿意,可以告诉我:

  • Ubuntu 版本(20.04 / 22.04 / 24.04)
  • 是否用 Docker
  • 是否交叉编译
  • 是否用于服务器部署

我可以给你针对性的编译命令和 Dockerfile。

0 踩