我已经构建了 OpenGL 加速库(libGL 和 libGLU),并将其保存在特定目录/usr/lib/mali
.我还有一个 OpenGL 的软件实现,安装在/usr/lib/arm-linux-gnueabihf
.这两个目录都首先添加到/etc/ld.so.conf
其中/usr/lib/mali
,以便程序更喜欢其中的库。
ldconfig
查找所有库:
$ sudo ldconfig -v
/usr/lib/mali:
libGLU.so.1 -> libGLU.so.1
libGL.so.1.2.0 -> libGL.so.1
/usr/lib/arm-linux-gnueabihf:
libGL.so.1 -> libGL.so.1.5.08005
libGLU.so.1 -> libGLU.so.1.3.08005
奇怪的部分是ldconfig
创建了一个符号链接libGL.so.1.2.0
,但对libGLU
.输出ldd
更奇怪:
ldd `which glxgears`
libGLU.so.1 => /usr/lib/mali/libGLU.so.1 (0xb6e4a000)
libGL.so.1 => /usr/lib/arm-linux-gnueabihf/libGL.so.1 (0xb6bb5000)
libGL.so.1.2.0 => /usr/lib/mali/libGL.so.1.2.0 (0xb67f1000)
输出表明该文件libGLU
是从硬件加速目录中获取的,而libGL
坚持软件实现。libGL.so.1.2.0
由于某种原因也被加载。最终我运行时使用的是软件实现glxgears
。
谁能解释一下发生了什么事吗?我可以做什么来让我的硬件加速库默认加载,而不删除或覆盖软件库/usr/lib/arm-linux-gnueabihf/
(它们实际上是包依赖项)?
PS:当我添加/usr/lib/mali/
到LD_LIBRARY_PATH
.
答案1
问题确实出在我的 Makefile 设置中。检查库objdump
揭示了根本原因:
$ objdump -p libGL.so.1 |grep SONAME
SONAME libGL.so.1.2.0
ldd
显示了libGL.so.1
和libGL.so.1.2.0
,因为第一个是由我导入的glxgears
,第二个是由我导入的,libGLU
它是针对硬件加速版本构建的libGL
,因此知道它的soname libGL.so.1.2.0
,。
修复方法是将 soname 更改为-soname,libGL.so.1
.