CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ../go/bin/go build -ldflags="-s -w" -trimpath -v -o /app/testapp ./main
这条命令是用于在非 Linux 环境下,编译出适用于 Linux amd64 架构的 Xray 可执行文件,并且做了一系列优化。
部分含义
CGO_ENABLED=0禁用 CGO 特性,编译出纯静态链接的二进制文件(不依赖系统的 C 库),保证在各种 Linux 发行版上都能运行
GOOS=linux指定编译目标操作系统为 Linux
GOARCH=amd64指定编译目标架构为 64 位 x86 架构(也就是常说的 x86_64/amd64)
../go/bin/go指定使用的 Go 编译器路径(不是系统默认的 go,而是自定义路径下的 go 程序)
buildGo 编译器的编译命令,用于构建可执行文件
-ldflags="-s -w"链接器参数优化:- -s:移除符号表(减少文件体积,无法用 nm 查看符号)- -w:移除调试信息(无法用 gdb 调试,进一步减小体积)
-trimpath移除编译产物中的文件绝对路径信息,让编译结果更干净,也避免暴露编译环境的路径
-v编译时输出详细日志,显示正在编译的包名,方便排查编译问题
-o /app/testapp指定编译输出的可执行文件路径和名称(输出到 /app/testapp)
./main指定编译的入口文件为当前目录下的 main.go(或 main 包)
补充说明
- 前置条件:
- 你需要确保
../go/bin/go这个路径下有可执行的 Go 编译器(版本需兼容 Xray 源码)。 - 源码目录下必须有
main.go文件(或 main 包),且代码能正常编译。
- 你需要确保
- 优化效果:
- 禁用 CGO +
-ldflags="-s -w"+-trimpath组合,能显著减小生成的二进制文件体积(通常能减少 30% 以上)。 - 纯静态编译的文件,在 Docker 镜像(如 alpine 基础镜像)中无需依赖任何动态库,运行更稳定。
- 禁用 CGO +
- 常见扩展:如果需要进一步压缩,编译后可使用
upx工具(需提前安装):
upx -9 -k /app/testapp
总结
这条命令的核心是跨平台编译:在非 Linux 环境下生成 Linux amd64 架构的 Xray 可执行文件。
关键优化点:禁用 CGO 实现纯静态编译,通过链接器参数和路径裁剪减小文件体积。
输出结果:在 /app 目录下生成名为 testapp 的优化后可执行文件,可直接在 Linux x86_64 系统运行。
Categories:
系统运维