安装ninja遇到 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

本文介绍了解决Ninja编译器因版本过低无法运行的问题,通过升级GCC版本或直接替换libstdc++.so.6库文件至最新版本,使Ninja能够正常工作。

https://github.com/ninja-build/ninja/releases下载ninja,设置好PATH路径,执行ninja命令显示如下:

[root@test bin]# ./ninja -v
./ninja: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./ninja)
./ninja: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by  ./ninja)

-----------------------------------------------------------------------------------------------------------------------------------------------
执行 strings 命令,发现确实没有`GLIBCXX_3.4.21'和`GLIBCXX_3.4.20'。

[root@test bin]# strings /lib64/libstdc++.so.6.0.19 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

-------------------------------------------------------------------------------------------------------------------------------------------------------------

解决方法:

1) 从https://ftp.gnu.org/gnu/gcc/选择一个新的版本的gcc,建议版本5以后的。我选择的是6.5.0。

2)编译gcc:

       tar -zxvf gcc-6.5.0.tar.gz

       cd gcc-6.5.0

      mkdir build

     cd  ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

     make

结果遇到了如下错误:C++ preprocessor "/lib/cpp" fails sanity check, 这是由于缺乏必要的c++库导致的,可以执行命令:yum install gcc-c++安装c++库,然后再执行make,就可以继续编译成功。如果想直接升级使用新版本的GCC,再执行make install。就可以了。如果不想使用新版本的gcc,可以继续一下几步,把 libstdc++.so替换为新的库即可。

3)查找  libstdc++.so.6.0.22文件,然后复制到/usr/lib64

4)  cd /usr/lib64

5) unlink libstdc++.so.6 和  ln libstdc++.so.6.0.22  libstdc++.so.6

6) 再执行ninja --version 显示版本如下:

终于搞定。

 

如果有现成的 libstdc++的新的版本,就不需要这么费周折编译gcc了,直接复制到/usb/lib64,做一下第5)步就可以了。


 

<think> 我们面临的问题是在编译LLVM(或使用llvm-min-tblgen)时遇到两个动态库问题: 1. 运行时提示找不到GLIBCXX_3.4.26 2. 运行时提示找不到GLIBCXX_3.4.29 同时,在make过程中出现错误。 首先,需要理解这些错误的原因: - GLIBCXX是GNU C++标准库(libstdc++)的版本符号。这些错误通常意味着我们当前系统中的libstdc++版本过低,不支持程序所需要的C++特性(即缺少所需的GLIBCXX版本)。 解决思路: 1. 检查当前系统中的libstdc++版本,确认是否确实低于所需版本(3.4.263.4.29)。 2. 如果确认版本太低,需要升级libstdc++。但要注意,升级系统库可能会影响系统稳定性,因此通常建议升级整个GCC工具链(包括libstdc++)到较新版本,或者使用非系统路径安装的较新GCC版本来编译LLVM。 3. 另一种解决方法是使用已经包含较新libstdc++的系统(如较新的Linux发行版)或者在当前系统中安装较新的GCC,并在编译LLVM时指定使用新版本的GCC和库。 具体步骤: ### 步骤1:确认当前系统中libstdc++支持的版本 在终端中运行以下命令: ```bash strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` 或者(如果上面的路径不存在,尝试以下路径): ```bash strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 查看输出中是否包含`GLIBCXX_3.4.26`和`GLIBCXX_3.4.29`。如果没有,则说明当前系统中的libstdc++版本过低。 ### 步骤2:升级GCC或安装新版GCC 如果系统中没有所需的GLIBCXX版本,那么需要安装更高版本的GCC(例如GCC 9或更新版本,因为GLIBCXX_3.4.26是在GCC 9中引入的,而3.4.29在GCC 10中引入)。 安装新版GCC的方法取决于你的Linux发行版。 对于Ubuntu/Debian系统: ```bash sudo apt update sudo apt install gcc-10 g++-10 # 安装GCC 10,它应该包含GLIBCXX_3.4.29 ``` 对于CentOS/RHEL系统: ```bash sudo yum install centos-release-scl sudo yum install devtoolset-10 scl enable devtoolset-10 bash # 启动一个使用devtoolset-10的shell ``` ### 步骤3:将新安装的GCC设为默认(可选,但推荐在编译环境中使用) 如果安装了多个GCC版本,可以使用`update-alternatives`来设置默认版本(Ubuntu/Debian): ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 sudo update-alternatives --config gcc sudo update-alternatives --config g++ ``` 或者,在编译LLVM时,显式指定使用新版本的GCC: ```bash export CC=/usr/bin/gcc-10 export CXX=/usr/bin/g++-10 ``` ### 步骤4:确认新的libstdc++路径并确保被使用 安装新GCC后,新的libstdc++.so通常位于`/usr/lib/gcc/x86_64-linux-gnu/10/`(具体路径根据版本和架构可能不同)。你需要确保程序运行时链接到新版本的库。 有时,即使安装了新版本的GCC,系统默认的libstdc++可能还是旧版本。你可以通过以下命令检查动态库链接情况: ```bash ldd $(which llvm-min-tblgen) # 如果已经安装,否则查看你编译生成的二进制文件 ``` 如果发现链接的还是旧版库,可以尝试: - 将新版本的libstdc++.so所在的目录添加到`LD_LIBRARY_PATH`中: ```bash export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/10:$LD_LIBRARY_PATH ``` 注意:将此命令放入你的shell配置文件(如.bashrc)中,以便每次启动都生效。 - 或者,更新动态库缓存: ```bash sudo ldconfig ``` ### 步骤5:重新编译LLVM 在确保环境变量(如CC、CXX)设置正确,并且新的libstdc++可用后,重新编译LLVM: ```bash cd /path/to/llvm/build rm -rf * # 清除之前的构建,避免旧对象文件干扰(谨慎使用) cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .. # 根据你的配置重新生成Makefile make -j$(nproc) ``` ### 步骤6:处理make过程中的错误 如果make过程仍然报错,需要具体查看错误信息。可能的错误原因包括: - 缺少依赖:确保安装了所有必要的构建依赖(如zlib、ncurses等)。 - 内存不足:编译LLVM需要大量内存,如果内存不足,尝试减少并行编译数(如`make -j2`)。 - 其他问题:根据错误信息具体分析。 ### 注意事项 - 升级系统库(尤其是libstdc++)可能会影响系统稳定性,因为其他程序可能依赖于旧版本。因此,通常建议在容器(如Docker)或虚拟机中编译,或者使用非系统路径安装的GCC(如通过源码安装到/opt目录)来避免影响系统。 - 如果是在生产环境,务必谨慎操作。 ### 相关问题 §§相关问题§§ 1. 如何查看当前系统中已安装的GLIBCXX版本? 2. 如何在Ubuntu系统中安装最新版本的GCC? 3. 如何在不影响系统稳定性的情况下使用新版本的GCC编译软件? 4. 如何设置LD_LIBRARY_PATH环境变量? 5. 如何解决编译过程中的内存不足问题? </think> 以下是解决LLVM编译过程中`llvm-min-tblgen`报错找不到`GLIBCXX_3.4.26`和`GLIBCXX_3.4.29`以及`make`报错的完整方案: --- ### 问题原因分析 1. **GLIBCXX缺失问题** - 错误提示`GLIBCXX_3.4.26`/`GLIBCXX_3.4.29`缺失,说明当前系统的GCC版本过低(需≥GCC 9/10),无法提供所需C++标准库支持[^1]。 - 通过命令验证: ```bash strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 若输出无`3.4.26`/`3.4.29`即确认问题。 2. **make报错** 通常是因GLIBCXX缺失导致依赖工具链失败,或编译环境配置不当(如路径冲突、依赖缺失)。 --- ### 解决方案(分步操作) #### 步骤1:升级GCC工具链 ```bash # Ubuntu/Debian sudo apt update sudo apt install -y gcc-10 g++-10 # 安装GCC 10(支持GLIBCXX_3.4.29) # CentOS/RHEL sudo yum install -y centos-release-scl sudo yum install -y devtoolset-10 scl enable devtoolset-10 bash # 激活新GCC环境 ``` #### 步骤2:更新动态库链接 ```bash # 查找新版libstdc++.so路径 sudo find / -name "libstdc++.so*" 2>/dev/null # 手动链接(示例路径,需替换实际路径) sudo ln -sf /usr/lib/gcc/x86_64-linux-gnu/10/libstdc++.so.6 /usr/lib64/libstdc++.so.6 sudo ldconfig # 刷新动态库缓存 ``` #### 步骤3:配置编译环境 ```bash # 设置新GCC为默认编译器 export CC=/usr/bin/gcc-10 export CXX=/usr/bin/g++-10 # 清除旧编译缓存(关键!) cd /path/to/llvm/build rm -rf * ``` #### 步骤4:重新编译LLVM ```bash # 生成构建配置(示例) cmake -G "Ninja" ../llvm \ -DCMAKE_C_COMPILER=/usr/bin/gcc-10 \ -DCMAKE_CXX_COMPILER=/usr/bin/g++-10 \ -DLLVM_ENABLE_PROJECTS="clang" # 启动编译(Ninja比make更快) ninja ``` --- ### 补充措施 1. **容器化编译(避免污染系统)** 使用Docker隔离环境: ```bash docker run -it ubuntu:22.04 # 自带GCC 12 apt update && apt install build-essential ninja-build ``` 2. **符号链接修复(若步骤2无效)** ```bash # 强制替换libstdc++ sudo cp /usr/lib/gcc/x86_64-linux-gnu/10/libstdc++.so.6 /usr/lib64/ sudo ldconfig ``` 3. **验证修复结果** ```bash # 检查GLIBCXX版本 ldd /path/to/llvm-min-tblgen | grep libstdc++ strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.29 ``` --- ### 注意事项 - **系统兼容性**:CentOS 7等旧系统需优先升级devtoolset,Ubuntu 18.04需添加`ppa:ubuntu-toolchain-r/test`源[^2]。 - **依赖完整性**:确保安装`zlib1g-dev`、`libncurses-dev`等基础依赖。 - **内存要求**:编译LLVM建议≥16GB RAM,可添加`-j$(nproc)`加速但避免OOM错误。 > 典型案例:用户升级GCC 10后需手动链接`libstdc++.so.6`,否则`ldd`仍指向旧版本[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值