我在我的主目录下构建了一个本地版本的OpenGL。我想链接另一个共享库,但由于某些原因,链接器仍然将它与/ usr / lib下的链接器链接起来,如ldd所报告的那样:
$ cc -o lib/libtfont.so -shared -Wl,-soname,/home/wknight/proj/wkl/tfont.lib/lib/libtfont.so tfont.o -L/home/wknight/proj/wkl/img.lib/lib -limg -L/home/wknight/swtools/opengl/lib -lGL -lGLU $ ldd lib/libtfont.so linux-gate.so.1 => (0xb7710000) /home/wknight/proj/wkl/img.lib/lib/libimg.so (0xb76fc000) libGL.so.1 => /usr/lib/libGL.so.1 (0xb7689000) libGLU.so.1 => /usr/lib/libGLU.so.1 (0xb7618000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb74d1000) libX11.so.6 => /usr/lib/libX11.so.6 (0xb73b4000) libXext.so.6 => /usr/lib/libXext.so.6 (0xb73a5000) libXxf86vm.so.1 => /usr/lib/libXxf86vm.so.1 (0xb73a0000) libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb739c000) libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb7397000) libdrm.so.2 => /usr/lib/libdrm.so.2 (0xb738d000) libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7367000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb734e000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7349000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7254000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7236000) /lib/ld-linux.so.2 (0xb7711000) libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb721d000) librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7214000) libXau.so.6 => /usr/lib/libXau.so.6 (0xb7211000) libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb720b000) $ ls -l /home/wknight/swtools/opengl/lib/libGL* lrwxrwxrwx 1 wknight wknight 10 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGL.so -> libGL.so.1 lrwxrwxrwx 1 wknight wknight 12 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGL.so.1 -> libGL.so.1.2 -rwxr-xr-x 1 wknight wknight 1836469 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGL.so.1.2 lrwxrwxrwx 1 wknight wknight 11 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGLU.so -> libGLU.so.1 lrwxrwxrwx 1 wknight wknight 20 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGLU.so.1 -> libGLU.so.1.3.070900 -rwxr-xr-x 1 wknight wknight 1634905 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGLU.so.1.3.070900 lrwxrwxrwx 1 wknight wknight 11 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGLw.so -> libGLw.so.1 lrwxrwxrwx 1 wknight wknight 15 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGLw.so.1 -> libGLw.so.1.0.0 -rwxr-xr-x 1 wknight wknight 37068 Jan 25 16:57 /home/wknight/swtools/opengl/lib/libGLw.so.1.0.0 $
即使我重命名本地版本的libGL.so并链接新名称,也会发生这种情况。所以我不理解幕后发生的事情。链接器是否在ld.so.cache中查找?我该如何覆盖呢?
答案 0 :(得分:0)
我找到了答案 - 我只需要将LD_LIBRARY_PATH设置为本地版本的libGL.so:
$ export LD_LIBRARY_PATH=$HOME/swtools/opengl/lib $ ldd lib/libtfont.so linux-gate.so.1 => (0xb778c000) /home/wknight/proj/wkl/img.lib/lib/libimg.so (0xb7778000) libGL.so.1 => /home/wknight/swtools/opengl/lib/libGL.so.1 (0xb771f000) libGLU.so.1 => /home/wknight/swtools/opengl/lib/libGLU.so.1 (0xb76ae000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7559000) libX11.so.6 => /usr/lib/libX11.so.6 (0xb743c000) libXext.so.6 => /usr/lib/libXext.so.6 (0xb742d000) libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb742a000) libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb7424000) libXxf86vm.so.1 => /usr/lib/libXxf86vm.so.1 (0xb741f000) libdrm.so.2 => /usr/lib/libdrm.so.2 (0xb7415000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb73fc000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb73f8000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7302000) libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb72dc000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb72be000) /lib/ld-linux.so.2 (0xb778d000) libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb72a5000) librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb729c000) libXau.so.6 => /usr/lib/libXau.so.6 (0xb7299000) libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7293000) $
当我认为ldd必须在报告共享库依赖项时使用运行时环境时,这对我来说是有意义的,而不仅仅是共享库本身存在的内容。在使用链接到共享库的可执行文件之前,我会设置LD_LIBRARY_PATH,但直到现在我才发现它还要设置它以检查共享库本身。
答案 1 :(得分:-1)
我在我的主目录
下构建了一个本地版本的OpenGL
为什么呢?你打算这样做的意图是什么? OpenGL不是一个库,而是一个规范。你建的很可能是MesaGL。 MesaGL只提供硬件加速的OpenGL,只有一些驱动程序子集,它们也必须与你的MesaGL版本相匹配。没有它们,MesaGL将陷入缓慢的软件光栅化器后备。
作为一般规则,您始终将程序动态链接到系统的libGL.so。如果没有libGL.so目前发货,只有当你可以处理一个非常慢的软件光栅化器时,后备实现才有意义。否则,我最好只是告知用户他的系统缺点,并且必须安装更好的GPU,或者修复驱动程序安装。
无论如何,如果你想更改搜索库的路径,你应该查看rpath
链接器标志。