无法在 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
基本上,尝试编写以下代码会导致以下错误:
代码
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