亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《CGO_ENABLED 如何影响动态链接和静态链接?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
问题内容我们正在编译要在 docker 上运行的 Go 代码,并且正在调查为什么我们的二进制文件没有执行。我们发现它缺少一些动态库(尽管我们需要静态链接的二进制文件)。
这就是它的编译方式。
env GOOS=linux CGO_ENABLED=1 GO111MODULE=on GOPRIVATE=github.com/ourrepo GOPROXY=https://proxy.golang.org go build --installsuffix cgo --ldflags='-extldflags=-static' -o程序main.go
使用相同构建命令与 CGO_ENABLED=0
最终解决了问题,并且输出二进制文件已静态链接。
现在奇怪的是我们有另一个程序使用相同的构建命令,这次使用 CGO_ENABLED=1
并且......它是静态链接的!
所以我很困惑为什么在某些情况下 CGO_ENABLED=1
会产生动态链接,有时会产生静态链接。很高兴提供更多详细信息。
解决方案
一些 Go 包在底层使用 CGO,利用(非常)通用的 C 库来实现跨环境和运行时遇到的边缘情况的更广泛兼容性。
这些通用库可以在大多数主要操作系统发行版上找到 - 但显然不包含在 Scratch 映像中(本质上是完全空的)。
CGO_ENABLED
默认设置为 1,这意味着必须使用 CGO_ENABLED=0
显式禁用它才能避免这种情况,即使使用 -static
标志也是如此。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《CGO_ENABLED 如何影响动态链接和静态链接?》文章吧,也可关注编程网公众号了解相关技术文章。