libGL error: failed to load driver: swrast 这行字弹出来的时候,ICEM CFD的图形窗口一片空白,鼠标能点但什么都看不到,控制台里还在刷 GLX 相关的报错。D:\ICEM\error_log\libGL_swrast.txt里记着这个报错的时间戳。
先看驱动。NVIDIA的机器上最常见的原因是Mesa的libGL和NVIDIA自己的OpenGL栈打架了,Mesa想加载swrast,NVIDIA的libGL却按自己的驱动布局走。验证一下当前哪个libGL在起作用,ldd查一下ICEM的可执行文件链接到了哪个libGL.so.1。装了NVIDIA驱动的话,/usr/lib/x86_64-linux-gnu/libGL.so.1通常是个软链接,指向nvidia的glx库。Mesa的libGL被优先加载了就会出swrast的报错。把/etc/ld.so.conf.d/里跟Mesa相关的配置删掉或者注释掉,ldconfig刷新一下缓存。显卡驱动版本太高也会导致ICEM启动崩溃甚至Fluent跟着闪退。ANSYS认证过的驱动版本一般比官网最新的低一到两个大版本,回退到那个版本比折腾Mesa省事。
swrast_dri.so这个库本身可能不在默认搜索路径下。报错里写得很清楚,搜索路径是/usr/lib/x86_64-linux-gnu/dri、${ORIGIN}/dri和/usr/lib/dri,但库实际只住在第一个路径下面。建一个软链接把库指到Mesa期望的位置,cd /usr/lib && mkdir ./dri && sudo ln -s /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so /usr/lib/dri/。这个操作对Intel显卡和AMD显卡都有效,AMD的OpenGL完全依赖Mesa,swrast报错基本都是DRI驱动缺了或者路径不对。库确认存在再建链接,ls /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so看一下。

成功启动图片
环境变量是绕过图形驱动冲突最直接的手段。LIBGL_ALWAYS_INDIRECT=1强制OpenGL走间接渲染,ICEM CFD虽然静态链接了libGL但X server缺GLX扩展的时候会报错,设了这个变量之后部分功能能恢复。另一个变量LIBGL_DRIVERS_PATH指向dri目录的绝对路径,export LIBGL_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri:$LIBGL_DRIVERS_PATH。这两个变量写在ICEM的启动脚本里,别写在.bashrc里,写全局的会影响其他图形程序。D:\ICEM\env_setup\launch_icem.sh里存着带环境变量的启动命令。
ANSYS自带的Mesa库是另一条路。安装目录下的Framework/bin/Linux64/Mesa里有ANSYS打包好的libGL,把那个目录加到LD_LIBRARY_PATH的前面,让ICEM优先用ANSYS自带的库,绕开系统的Mesa和NVIDIA驱动。LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ansys_inc/v241/Framework/bin/Linux64/Mesa,然后export FLUENT_ARCH="lnamd64",再启动runwb2加-oglmesa参数。这个方法的副作用是Workbench和Fluent也会用自带的Mesa,渲染质量不如原生驱动但至少能出图。libGL.so.1如果ANSYS期望在/usr/lib下面而实际在/usr/lib/x86_64-linux-gnu/mesa下面,建一个软链接过去就行,sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so.1。
conda虚拟环境里的libstdc++版本跟系统的swrast_dri.so不兼容也会报这个错。报错信息里会写version `GLIBCXX_3.4.29' not found,swrast_dri.so需要更新版本的libstdc++但conda环境里的太旧了。conda activate xxx之后conda install -c conda-forge libstdcxx-ng,把conda环境里的libstdc++更新到跟系统匹配的版本。用了conda环境跑ANSYS的话这个坑绕不开。
字体库有时候也被当成替罪羊。xfonts-75dpi和xfonts-100dpi装上之后有些机器上libGL的报错会消失,虽然逻辑上字体跟OpenGL驱动没什么关系,但CFD-Online上有人确认过这个操作解决了启动问题。先装驱动再装字体,别反过来。
查一下ICEM启动脚本里的LIBGL_DEBUG变量。export LIBGL_DEBUG=verbose,再启动ICEM,控制台会打出详细的驱动加载过程,能看到它具体在哪个路径下找哪个库、找到没找到、加载失败的原因是什么。这个输出比光看一行报错有用得多,把verbose的输出存到D:\ICEM\error_log\libGL_verbose.log里,下次报错先看这个文件。
D:\ICEM\env_setup\下面那个launch_icem.sh的LD_LIBRARY_PATH顺序还没改,ANSYS自带的Mesa目录加在最后面了,应该加到最前面才能覆盖系统的libGL,那个路径是……
When I start the icem cfd from command line in opensuse leap 15.1 , it gives me the errors of : libGL error: unable to load driver: swrast_dri.so libGL error: failed to load driver: swrast
It can be easily solved by spedifing the library used by the icemcfd directly as env LD_LIBRARY_PATH=/home/ztdep/ansys_inc/v162/Framework/bin/Linux64/Mesa/ ./icemcfd
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删