首页  >  文章  >  后端开发  >  为什么创建静态 Go 二进制文件需要 `CGO_ENABLED=0` 和 `-ldflags \'-extldflags \"-static\"\'` ?

为什么创建静态 Go 二进制文件需要 `CGO_ENABLED=0` 和 `-ldflags \'-extldflags \"-static\"\'` ?

Patricia Arquette
Patricia Arquette原创
2024-10-28 19:53:29167浏览

Why are both `CGO_ENABLED=0` and `-ldflags '-extldflags

如何在Go中创建静态二进制文件

基于scratch构建Docker镜像时,用户在执行二进制文件时可能会遇到错误,因为缺少图书馆。这可以通过在编译期间设置 CGO_ENABLED=0 和 -ldflags '-extldflags "-static"' 标志来解决。

为什么这两个标志都是必要的?

CGO_ENABLED =0 禁止在 Go 中使用 C 代码,确保二进制文件不依赖于外部 C 库。

-ldflags '-extldflags "-static"' 指示链接器构建静态链接的二进制文件,消除目标环境上对共享库的需求。

虽然这两个选项都有助于创建静态二进制文件,但它们有不同的用途:

  • CGO_ENABLED=0 防止对外部 C 库的任何依赖.
  • -ldflags '-extldflags "-static"' 专门静态链接所有 Go 相关的库(如运行时、数学等)。

不带 -ldflags '- extldflags "-static"',即使 CGO 被禁用,Go 二进制文件仍然会依赖共享的 Go 库,导致基于暂存的 Docker 镜像出现“没有这样的文件或目录”错误。因此,使用这两个标志对于创建独立于目标环境库的真正静态二进制文件至关重要。

以上是为什么创建静态 Go 二进制文件需要 `CGO_ENABLED=0` 和 `-ldflags \'-extldflags \"-static\"\'` ?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn