无法在 Fedora 35 中加载 `swrast` 和 `iris` 驱动程序

Cannot load `swrast` and `iris` drivers in Fedora 35

基本上,尝试编写以下代码会导致以下错误:

代码

from matplotlib import pyplot as plt
plt.plot([1,2,3,2,1])
plt.show()

错误

libGL error: MESA-LOADER: failed to open iris: /home/xxx/.conda/envs/stat/lib/python3.8/site-packages/pandas/_libs/window/../../../../../libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/lib64/dri/iris_dri.so) (search paths /usr/lib64/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /home/xxx/.conda/envs/stat/lib/python3.8/site-packages/pandas/_libs/window/../../../../../libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/lib64/dri/swrast_dri.so) (search paths /usr/lib64/dri, suffix _dri)
libGL error: failed to load driver: swrast

我在 Whosebug 上发现了类似的错误,但 none 正是这里所需要的。

简答:export LD_PRELOAD=/usr/lib64/libstdc++.so.6

长答案:

潜在的问题是我们有一个软件是用旧的 C++ 编译器构建的。编译器的一部分是它对 libstdc++ 的实现,它成为编译器构建的任何东西的运行时要求的一部分。显然,有问题的软件带来了自己的、较旧的 libstdc++ 实现, 给出了其 libstdc++ 优先于系统的 libstdc++.通常,这是通过 $LD_LIBRARY_PATH 环境变量完成的。不幸的是,/usr/lib64/dri/swrast_dri.so 是由本机编译器为该系统构建的一个系统软件,它比构建其他相关软件的编译器更新。这样做的结果是,首先加载较旧的编译器的 libstdc++,以及较旧的、更有限的符号集。然后当它想要加载 swrast 时,失败了,因为 swrast 坚持使用 compiler/runtime 的级别来构建它。整个混乱的解决方案是强制系统的(较新的)libstdc++ 投入使用并阻止较旧的 libstdc++ 发挥作用。这是通过我们设置预加载环境变量的代码片段 export LD_PRELOAD=/usr/lib64/libstdc++.so.6 实现的。

从 conda-forge 安装 libstdcxx-ng 应该可以解决这个问题。

命令:

conda install -c conda-forge libstdcxx-ng

Mahyar Mirrashed 提出的解决方案对我有用。 在我的系统 (Ubuntu 22.04) 上,libstdc++.so.6 文件位于 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 要知道在哪里可以找到这个文件,我建议 运行 使用以下命令:

find / -name libstdc++.so.6 2>/dev/null

这导致文件来自 miniconda、snap 和 /usr/lib/... 我将导出 LD_PRELOAD 添加到我的 .bashrc 文件中,它工作正常。

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6