【Linux-编译器gccglibc升级】CentOS7.9使用NodeJS18时报错lib64libm.so.6: version `GLIBC
作者:mmseoamin日期:2023-12-25

【Linux-编译器gcc/glibc升级】CentOS7.9使用NodeJS18时报错/lib64/libm.so.6: version `GLIBC_2.27' not found

  • 背景
  • 分析原因
  • 解决方案
  • 执行步骤
    • 推荐方式
    • 踩坑记录

      文章已收录至https://lichong.work,转载请注明原文链接。

      ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝

      背景

      最近做一个前端项目Jenkins的自动构建时,项目使用nodejs18,正好公司Jenkins节点有些不够用,就用了台资源空余比较多的服务器用于充当Jenkins节点,配置好NodeJS路径后,构建时产生报错如下:

      node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
      

      分析原因

      使用strings命令查看当前glibc支持的版本

      # 使用strings命令查看
      strings /lib64/libc.so.6 |grep GLIBC_
      # 查看结果如下:
      GLIBC_2.2.5
      GLIBC_2.2.6
      GLIBC_2.3
      GLIBC_2.3.2
      GLIBC_2.3.3
      GLIBC_2.3.4
      GLIBC_2.4
      GLIBC_2.5
      GLIBC_2.6
      GLIBC_2.7
      GLIBC_2.8
      GLIBC_2.9
      GLIBC_2.10
      GLIBC_2.11
      GLIBC_2.12
      GLIBC_2.13
      GLIBC_2.14
      GLIBC_2.15
      GLIBC_2.16
      GLIBC_2.17
      GLIBC_PRIVATE
      

      发现只能到2.17

      执行ldd --version也会看到glibc版本是2.17

      解决方案

      1. 升级 gcc 和 glibc 版本:注意,在升级前备份重要数据,并仔细阅读相关文档和使用说明。
      2. 使用其他发行版:可以考虑使用其他发行版,如 Ubuntu 或 Fedora,这些发行版默认已经安装了适用于 Node.js 18 的 gcc 和 glibc 版本。
      3. 使用 Node.js 16:Node.js 16 是一个长期支持版本(LTS),它需要的 gcc 和 glibc 版本要求相对较低,可能与你的系统版本兼容。您可以尝试使用 Node.js 16,它可以提供类似于 Node.js 18 的功能,并在未来几年内受到支持和更新。

      小结

      作为硬核技术派头铁程序员,我当然选择方案一。

      执行步骤

      我们可以手动下载gcc包和glibc包,然后进行配置、编译、安装、挂载这些步骤,但这样做风险还是有点大的,特别是不太懂的小白很容易把服务器搞崩。

      推荐方式

      这里推荐先使用devtoolset工具进行自动安装,操作步骤如下:

      1. 安装 devtoolset 8:Devtoolset 8 包括更新的 GCC 和 GLIBC,可以满足 Node.js 18 的要求。使用以下命令安装 Devtoolset 8:
      sudo yum install centos-release-scl
      sudo yum install devtoolset-8
      
      1. 激活 devtoolset 8:安装完成 Devtoolset 8 后,需要激活 Devtoolset 8 才能使用更新的 GCC 和 GLIBC。使用以下命令激活 Devtoolset 8:
      scl enable devtoolset-8 bash
      
      1. 更新 GCC 和 GLIBC:使用 Devtoolset 8 提供的更新版本替换系统自带的 GCC 和 GLIBC。使用以下命令更新:
      sudo yum install devtoolset-8-toolchain
      sudo scl enable devtoolset-8 bash
      
      1. 验证更新版本:使用以下命令验证 GCC 和 GLIBC 版本:
      gcc --version
      ldd --version
      

      如果显示的 GCC 版本为 8.x.x,并且显示的 GLIBC 版本为 2.28 或更高版本,则说明已成功更新。

      5. 再执行node -v命令来看看是否还有报错?

      踩坑记录

      执行ldd --version后发现glibc还是2.17版本,所以需要手动升级了,附上手动升级glibc的步骤:

      1. 下载 GLIBC 源码:可以从官方网站或者清华镜像下载 GLIBC 的源码包,例如 glibc-2.28.tar.gz(不建议装太新的)。
      2. 解压源码包:使用 tar 命令解压源码包:
      tar -xzf glibc-2.28.tar.gz
      
      1. 编译和安装:切换到源码目录并使用 configure 和 make 命令编译和安装 GLIBC:
      cd glibc-2.28
      mkdir build
      cd build
      ../configure --prefix=/usr
      make
      sudo make install
      
      1. 安装成功。

      文章已收录至https://lichong.work,转载请注明原文链接。

      ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~往期精选🪶~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      【Docker】入门教程-基本概念解读

      【前端-React Native】移动端原生开发整合React Native Elements教程-安卓示例

      【前端-开发环境】使用NVM实现不同nodejs版本的自由切换(NVM完整安装使用手册)

      【前端-NPM私服】内网使用verdaccio搭建私有npm服务器

      【前端-IE兼容】Win10和Win11使用Edge调试前端兼容IE6、IE7、IE8、IE9、IE10、IE11问题

      【前端-工程化】React项目工程化记录-内置项目活文档(老项目升级优化-集成Hosky/ESLint/Prettier-升级Webpack/Babel/NodeSass/React)

      【工具-TWRP-frp-Termux】旧手机暴改成免费云服务器-MIUI刷TWRP安装magisk获取root

      【工具-Shell脚本】java程序产品包模板-linux和windows通用shell启动停止脚本(无需系统安装Java运行环境)

      【工具-Nginx】从入门安装到高可用集群搭建

      【工具-Nginx】Nginx高性能通用配置文件-注释版-支持防刷限流、可控高并发、HTTP2、防XSS、Gzip、OCSP Stapling、负载、SSL

      【工具-WireShark】网络HTTP抓包使用教程

      【后端-maven打包】通过profile标签解决同时打jar包 war包需求

      【架构-DDD】使用领域驱动设计-互联网未来架构设计之道(一)

      【后端-SpringCache】基于Spring Cache封装一个能够批量操作的Redis缓存记录下踩坑历程(pipeline或mget封装)

      【后端-SkyWalking】SkyWalking前后端开发环境搭建详细教程步骤-6.x/7.x/8.x版本通用-插件二次开发利器(一)

      【后端-Quartz】Springboot整合Quartz支持集群环境-设计业务与框架分离及实现定时任务调度

      ✨欢迎为耿直少年点赞、关注、收藏!!!

      👇👇👇