我已经构建了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中时,硬件加速库确实可以工作。
发布于 2015-08-13 17:44:09
问题确实发生在我的Makefile设置中。用objdump检查图书馆揭示了根本原因:
$ objdump -p libGL.so.1 |grep SONAME
SONAME libGL.so.1.2.0ldd同时显示了libGL.so.1和libGL.so.1.2.0,因为第一个是由glxgears导入的,第二个是通过我的libGLU实现导入的,后者是针对硬件加速版libGL构建的,因此知道它的名字libGL.so.1.2.0。
解决办法是用-soname,libGL.so.1修改奏鸣曲。
https://unix.stackexchange.com/questions/222396
复制相似问题