Golang 编译优化

代码笔记 | 📅 2021-12-02 | golang

普通编译

go build -o 输出文件 ./main 

优化编译尺寸

优化编译尺寸,可以使用 -ldflags '-s -w'

go build -ldflags '-s -w' -o 输出文件 ./main 

其中 -w 会移除调试信息,-s 会同时移除调试信息和符号表,使用 -s 会使得编译出来的文件更小。也可以两者同时使用,但是同时使用的情况下,-w 显得没有意义。

需要注意的是,使用 -w 或者 -s 后,会使得程序不可调试,在开发阶段应按需使用。

静态编译

默认情况下,golang编译会使用一些动态链接库。比如在使用网络库后,会依赖 glibc 。

可以通过添加参数 -ldflags '-linkmode "external" -extldflags "-static"' 使所有库都静态编译,以移除动态依赖。

go build -ldflags '-linkmode "external" -extldflags "-static"' -o 输出文件 ./main 

提示: 在linux下可以通过 ldd 命令查看可执行文件的动态依赖。

对比如下:

$ go build -o main main.go 
$ ldd main
        linux-vdso.so.1 (0x00007ffdb19e2000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0cb33a1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0cb31dc000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0cb33dc000)
$ go build -ldflags '-s -w -linkmode "external" -extldflags "-static"' -o main main.go 
$ ldd main
        不是动态可执行文件
$ 

最终命令样式

go build -ldflags '-s -w -linkmode "external" -extldflags "-static"' -o 输出文件 ./main