CircleCI Ubuntu14环境GLIBCXX_3.4.20升级或兼容编译NodeJS项目咨询
碰到这种GLIBCXX版本不兼容的问题确实头疼,尤其是在CircleCI这种固定环境里没法随便升级系统库。我给你两个可行的解决思路,你可以根据情况选:
方案一:尝试在Ubuntu 14上升级GLIBCXX到3.4.21(不推荐,有风险)
Ubuntu 14.04的官方软件源里最高只提供GLIBCXX_3.4.20,要升级到3.4.21只能手动替换库文件,不过这可能破坏系统依赖(很多系统工具依赖旧版本的libstdc++),所以仅作为备选方案:
- 先检查当前系统的GLIBCXX版本:
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX - 备份原有的库文件:
sudo cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.bak - 获取GLIBCXX_3.4.21对应的库文件:
你可以从Ubuntu 16.04的系统中复制libstdc++.so.6.0.21文件,或者从可信的预编译源下载(注意要匹配x86_64架构)。 - 替换并更新软链接:
sudo cp libstdc++.so.6.0.21 /usr/lib/x86_64-linux-gnu/ sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 - 验证升级结果:重新运行第一步的命令,应该能看到
GLIBCXX_3.4.21。
⚠️ 注意:替换后可能导致系统内其他依赖旧libstdc++的程序崩溃,如果CircleCI环境里有其他任务依赖系统工具,这个方案风险很高。
方案二:在兼容GLIBCXX_3.4.20的环境中编译项目(推荐)
这个思路更稳妥:直接在Ubuntu 14.04环境中编译你的Node.js项目(尤其是scrypt这个依赖),这样编译出来的产物会自动适配GLIBCXX_3.4.20,部署到CircleCI时就不会报错了。有两种实现方式:
方式1:用Docker在本地模拟Ubuntu 14环境编译
适合你想提前验证编译结果,再部署到CircleCI的场景:
- 拉取Ubuntu 14.04镜像:
docker pull ubuntu:14.04 - 启动容器并挂载本地项目目录(把
/path/to/your/local/project替换成你实际的项目路径):docker run -it -v /path/to/your/local/project:/project ubuntu:14.04 /bin/bash - 在容器内安装Node.js(和你本地使用的版本保持一致,比如12.x,替换命令中的
X.x)和编译依赖:apt-get update && apt-get install -y build-essential curl curl -sL https://deb.nodesource.com/setup_X.x | bash - apt-get install -y nodejs - 进入项目目录,安装依赖并重新编译
scrypt:cd /project npm install # 强制从源码编译scrypt,确保适配当前环境 npm rebuild scrypt --build-from-source - 编译完成后,退出容器,本地项目的
node_modules目录里的scrypt就是兼容Ubuntu 14的版本了,直接部署到CircleCI即可。
方式2:在CircleCI环境中直接编译
适合不想在本地折腾Docker,直接让CircleCI完成编译的场景:
修改你的CircleCI配置文件(.circleci/config.yml),添加安装依赖和编译的步骤,确保在Ubuntu 14环境中完成依赖构建:
version: 2.1 jobs: build-and-test: docker: - image: ubuntu:14.04 steps: - checkout - run: name: Install system dependencies command: | apt-get update && apt-get install -y build-essential curl # 安装和本地一致的Node.js版本,比如12.x curl -sL https://deb.nodesource.com/setup_12.x | bash - apt-get install -y nodejs - run: name: Install npm dependencies command: npm install - run: name: Rebuild scrypt for Ubuntu 14 command: npm rebuild scrypt --build-from-source # 这里添加你的测试、部署步骤 workflows: version: 2 build-deploy: jobs: - build-and-test
这样CircleCI会在Ubuntu 14环境中重新编译scrypt,生成的scrypt.node依赖的就是GLIBCXX_3.4.20,自然不会再报版本缺失的错误。
内容的提问来源于stack exchange,提问作者user9245394
相关产品推荐
相关产品推荐

