golang cgo 静态编译

通常来说,我们go编译出来的可执行文件,是一个动态链接的可执行文件,依赖gcc,libc等一些动态lib。这样如果你跨平台去用,比如ubuntu 22.04编译的可执行文件,到debian 10上就不能运行了,因为动态lib都不一样。版本不匹配,不兼容。

我们可以通过静态编译的方法,来把golang的应用,编译成完全静态的可执行文件。

当然了,文件体积会大一些,但是更通用一些。丢到任何一台linux,只要认,就能运行。

我们先装一下musl 类库的工具

apt-get update 
apt-get install -y musl musl-dev musl-tools

然后开始编译

CGO_ENABLED=1 CC=musl-gcc go build --ldflags '-linkmode external -extldflags "-static"' -v

这样编译出来的静态文件,就可以放到任何linux运行。

如何看一个应用是动态编译链接的,还是静态链接的,可以用ldd命令检测

例如:下面就是一个动态链接的应用程序

# ldd /usr/bin/vim
linux-vdso.so.1 (0x00007fff719c8000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6701f18000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f6701ee6000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f6701eba000)
libsodium.so.23 => /lib/x86_64-linux-gnu/libsodium.so.23 (0x00007f6701e62000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f6701e58000)
libgpm.so.2 => /lib/x86_64-linux-gnu/libgpm.so.2 (0x00007f6701e50000)
libpython3.10.so.1.0 => /lib/x86_64-linux-gnu/libpython3.10.so.1.0 (0x00007f6701876000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f670164e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f67023af000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f67015b7000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f6701586000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f670156a000)

分类: 默认 标签: 发布于: 2022-06-25 11:20:01, 更新于: 2022-06-25 11:27:35