/lib64/libc.so.6: version `GLIBC_2.34' not found

golang本地的开发环境是1.18,结果引用的模块需1.19版本.于是乎升级到最近的版本1.22.结果发现编译的文件在服务器上运行报了下面的错误。

/lib64/libc.so.6: version `GLIBC_2.34' not found

我一般采用docker本地编译,对应环境的文件,然后线上运行。原来的命令是:

docker run -v "$GOPATH":/go -e "GOPROXY=https://proxy.golang.com.cn,direct" --rm -v "$PWD":/go/src/myapp -w /go/src/myapp -e GOOS="linux" -e GOARCH="amd64" golang:1.18 go build -v

# 命令通过挂载当前工作目录和GOPATH到容器内部,使用指定的Go版本进行构建。

# 具体操作包括:
# 1. 挂载GOPATH到容器的/go目录,以便容器可以访问项目的依赖。
# 2. 设置环境变量GOPROXY,使用中国的Go代理服务器,以加速依赖下载。
# 3. 挂载当前工作目录到容器的/go/src/myapp目录,以便容器可以访问应用的源代码。
# 4. 设置容器的工作目录为/go/src/myapp,这样容器内部的构建操作将在应用源代码目录下进行。
# 5. 设置构建目标的操作系统和架构为linux/amd64。
# 6. 使用Go语言版本1.18进行构建。
# 7. 通过-v标志将容器内的构建结果留在主机上。
# 8. 使用--rm标志在容器运行结束后自动删除容器。

后来我将命令修改为下面的方式,添加了 CGO_ENABLED=0 禁用CGO,可以构建出静态链接的二进制文件,便于在多种环境中运行。

docker run -v "$GOPATH":/go \
          -e "GOPROXY=https://proxy.golang.com.cn,direct" \
          --rm \
          -v "$PWD":/go/src/myapp \
          -w /go/src/myapp \
          -e CGO_ENABLED=0 \
          -e GOOS="linux" \
          -e GOARCH="amd64" \
          golang:1.22 \
          go build -v
# 解释:
# -v "$GOPATH":/go:将主机的GOPATH挂载到容器的/go路径,以便使用主机的依赖。
# -e "GOPROXY=https://proxy.golang.com.cn,direct":设置GOPROXY环境变量,使用中国的Go代理以加快下载速度,同时允许直接访问模块。
# --rm:容器运行结束后自动删除容器,避免容器积累。
# -v "$PWD":/go/src/myapp:将当前工作目录挂载到容器的/go/src/myapp路径,以便在容器内构建主机上的项目。
# -w /go/src/myapp:设置容器的工作目录为/go/src/myapp,确保构建命令在正确目录下执行。
# -e CGO_ENABLED=0:禁用CGO,这样可以构建出静态链接的二进制文件,便于在多种环境中运行。
# -e GOOS="linux" -e GOARCH="amd64":设置目标构建平台为Linux amd64,即使主机平台不同。
# golang:1.22:使用Go语言1.22版本的镜像作为构建环境。
# go build -v:在容器内执行构建命令,输出构建过程中的详细信息。

上传后问题解决。

下面的解决方式是claude 3 Opus生成的。

这个错误提示意味着你的系统上安装的 GNU C 库 (glibc) 版本低于程序所需的版本 2.34。

要解决这个问题,你有以下几个选择:

  1. 升级系统的 glibc 版本:

    • 在基于 RPM 的系统(如 CentOS、RHEL)上,可以使用以下命令升级 glibc:

      sudo yum update glibc
      
    • 在基于 Debian 的系统(如 Ubuntu)上,可以使用以下命令升级 glibc:

      sudo apt-get update
      sudo apt-get install libc6
      
  2. 静态链接 glibc:

    • 如果你有程序的源代码,可以尝试在编译时使用静态链接的方式链接 glibc。这样可以避免动态链接库版本不匹配的问题。
    • 在编译时添加 -static 标志,例如:
      gcc -static -o program program.c
      
  3. 使用兼容的 glibc 版本:

    • 如果升级 glibc 或静态链-接都不可行,你可以尝试在另一个安装了兼容 glibc 版本的系统上运行该程序。
    • 可以考虑使用 Docker 容器或虚拟机来提供一个与程序兼容的运行环境。
  4. 重新编译程序:

    • 如果你有程序的源代码,可以尝试在当前系统上重新编译程序,使其与当前的 glibc 版本兼容。 ,其实我上面的解决办法是采用了这种。
    • 确保编译器和相关库的版本与当前系统的 glibc 版本匹配。

需要注意的是,升级 glibc 可能会影响其他依赖于 glibc 的程序,因此在升级前请仔细评估可能的影响。


参考链接:

  1. Error /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34’ not found
end
  • 作者:kali(作者介绍)
  • 更新时间:2022-07-20 18:09
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:转载站点文章,请附上原文链接
  • 翻译声明:翻译文章会不严谨,请务必附上原文链接
  • 扫描阅读:扫描二维码,手机阅读该文章