解决conda环境libstdc++版本过低问题
环境:
ubantu版本22.04。conda版本conda 23.9.0
问题:
编译时提示undefined reference to … @GLIBCXX_3.4.30.链接时找不到该版本的库。
个人解决过程:
- 检查系统libstdc++的版本,版本已经是最新(libstdc++.6.0.30)
- 安装相应的libstdc+±dev(问copilot 它提示我要装 我目前还不知道是否必要)
- 重新检查警告,发现了这条:runtime library [libQt5OpenGL.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/zhk/anaconda3/lib。这意味着链接时可能采用anaconda中较低版本的库,而非使用系统的。 - 查看anaconda中libstdc++的版本 发现确实版本比较老(libstdc++.so.6.0.29)
- 尝试修改环境变量,想链接到系统的最新版本的库。但是Cmake还是优先找conda环境中的库。
- 换思路,直接更新conda中的库。先尝试利用conda更新:conda install -c anaconda libstdcxx-ng。发现conda安装的最新版本还是6.0.29。
- 了解libstdc++.so的原理(软链接),结合系统中已经存在libstdc++.6.0.30,决定手动修改,更新conda中libstdc++。
- 手动修改后 编译成功!!
手动修改conda环境中libstdc++版本
- 把系统中高版本的libstdc++.so.6.0.30复制到conda相应环境的lib中(记得修改前备份,防止改错了)
- 删除原有软链接
rm libstdc++.so libstdc++.so.6
- 创建新的软链接
sudo ln -s libstdc++.so.6.0.30 libstdc++.so.6
sudo ln -s libstdc++.so.6.0.30 libstdc++.so
4.检查新的软链接是否创建成功
ls -l libstdc++.so
ls -l libstdc++.so.6
输出大概像这样:
lrwxrwxrwx 1 root root 19 2月 3 13:51 libstdc++.so -> libstdc++.so.6.0.30
对自己的启示:
- 看编译器提示要全面地看,不要忽略警告。
- 一条路走不通可以暂时让脑子放松一下 跳出来想想还有没有别的办法。