Published on

CGO_ENABLE的作用

Authors

CGO导致出错

CGO_ENABLED 在linux环境下是默认开启的,导致编译时如果有依赖c的代码会编译不过。

go env -w CGO_ENABLED='0'

将CGO关闭后就可正常编译通过,并运行。

这个选项的作用是?

这个选项默认开启,在编译时依赖底层的库函数可以调用c的实现,性能最高,但依赖libc库。

如果关闭该选项,那么编译出来的二进制文件就是纯静态,不依赖任何动态库,性能会稍微差一些。

还有一种纯静态编译,不关闭CGO的前提下。

cmd/link 有两种工作模式:internal linking和external linking。

internal linking:若用户代码中仅仅使用了 net、os/user 等几个标准库中的依赖 cgo 的包时,cmd/link 默认使用 internal linking,而无需启动外部external linker(如:gcc、clang等);

external linking:将所有生成的.o都打到一个.o文件中,再将其交给外部的链接器,比如 gcc 或 clang 去做最终链接处理。 如果我们在写入参数 -ldflags '-linkmode "external" -extldflags "-static"',那么 gcc/clang 将会去做静态链接,将.o中undefined的符号都替换为真正的代码。

go build -o server -ldflags '-linkmode "external" -extldflags "-static"' server.go

使用ldd可查看二进制是否依赖动态库。

如果编译出错,需要安装glibc-static这个库