3

我在同一台 Ubuntu 11.04 机器上有两个不同的 libGL 库。一个库是为 Nvidia 的显卡安装的,/usr/lib/libGL.so另一个是随 Ubuntu 一起安装的默认库,位于usr/lib/x86_64-linux-gnu/mesa/libGL.so.

现在,我遇到的问题是从 Ubuntu 的存储库下载的 Qt 库链接到 mesa 库,但我想链接到 Nvidia 的库。这可能会提供更好的性能,并且在编译程序时使用 mesa 的 libGL 会出现问题。这些已通过以下方式修复:

export LIBGL_ALWAYS_INDIRECT=1

据我所知,这迫使 X11 选择 openGL 库,并且它选择了正确的库。但是,我更希望 Qt 和使用 QtOpenGL 编译的程序直接与正确的库链接。

我下载了 Qt 并使用这些选项自己编译了它:

./configure -nomake examples -nomake demos -nomake tools -release -no-webkit

我希望链接器会使用正确的库。没有骰子。接下来,我尝试mkspec/linux-g++-64/qmake.conf使用这些变量集进行编辑:

QMAKE_LIBDIR_X11      = /usr/lib/x86_64-linux-gnu
QMAKE_LIBDIR_OPENGL   = /usr/lib

是否有一个选项可以强制链接特定库而不是另一个库(特别是在运行配置脚本时)?我不希望以任何特定方式配置链接器。我也不想删除台面库。

如果没有这样的配置脚本标志,有没有办法设置链接器使用的库的优先级?

在最坏的情况下,我可能会在./configure运行后更改所有 Makefile。Grep 整个 Qt 树以供使用-lGL并将其更改为/usr/lib/libGL.so. 我觉得这是一个相当的黑客。

更新

一些成功。我在 Qt 树上为 lGL 做了一个 grep,发现其他 mkspecs(除了linux-g++-64)使用其他变量来指定 OpenGL 路径。所以我将它们添加到linux-g++-64mkspec 中,结果如下mkspec/linux-g++-64/qmake.conf

QMAKE_LIBS_OPENGL     = /usr/lib/libGL.so
QMAKE_LIBS_OPENGL_QT  = /usr/lib/libGL.so

所以我设置了我想要直接认为它会正确链接的库的路径。确实这是个好消息,在编译期间,-lGL 从未使用过。但是,最终的结果lib/libQtOpenGL.so仍然是链接到了错误的库:

$ ldd lib/libQtOpenGL.so
    linux-vdso.so.1 =>  (0x00007fffd83ff000)
    libQtGui.so.4 => (edited)lib/libQtGui.so.4 (0x00007f554c684000)
    libQtCore.so.4 => (edited)lib/libQtCore.so.4 (0x00007f554c19c000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f554beda000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f554bcd6000)
    **libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f554ba7a000)**
    libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f554b86e000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f554b536000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f554b22f000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f554afaa000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f554ad94000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f554a9f5000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f554a7d7000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f554a4e1000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f554a2ba000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f554a0a1000)
    libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007f5549e99000)
    libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f5549c7f000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f5549a48000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f5549835000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f554962f000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f5549427000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f554d66f000)
    libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f5549203000)
    libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f5548fff000)
    libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f5548df9000)
    libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f5548bf3000)
    libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f55489e7000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f55487cb000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f554858e000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f5548389000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f554815f000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f5547f5b000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f5547d55000)

我不知道为什么,我直接指定了要使用的库并且它被正确传递给g++,但链接器显然忽略了它。我相信这不再是 Qt 问题,而是链接器问题。

是否有任何方法ldconfig或其他工具来指定链接到的库以防万一-lGL?我知道其他库有一个程序可以组织要使用的库(libusb-config来自我的),但我认为 openGL 不是这种情况。

4

1 回答 1

1

链接器需要重新配置才能为 openGL 找到正确的库。一个这样的选项,经常皱眉头是更改LD_LIBRARY_PATH变量以包含您希望使用的 openGL 库的路径。在我的情况下,它位于/usr/lib所以我相应地更改了变量。

export LD_LIBRARY_PATH=/usr/lib/fsl/4.1:/usr/lib

在使用相同的选项运行./configure脚本并制作之后,它终于指向了正确的库。

ldd lib/libQtOpenGL.so
    linux-vdso.so.1 =>  (0x00007fff04ebf000)
    libQtGui.so.4 => (edited)Qt4.8.1/lib/libQtGui.so.4 (0x00007fad8826c000)
    libQtCore.so.4 => (edited)Qt4.8.1/lib/libQtCore.so.4 (0x00007fad87d84000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007fad87ac2000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fad878be000)
    **libGL.so.1 => /usr/lib/libGL.so.1 (0x00007fad875a8000)**
    libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007fad8739c000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fad87064000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fad86d5d000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fad86ad8000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fad868c2000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fad86523000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fad86305000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fad8600f000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007fad85de8000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fad85bcf000)
    libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007fad859c7000)
    libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007fad857ad000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007fad85576000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fad85363000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007fad8515d000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fad84f55000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fad89257000)
    libnvidia-tls.so.290.10 => /usr/lib/tls/libnvidia-tls.so.290.10 (0x00007fad84d52000)
    libnvidia-glcore.so.290.10 => /usr/lib/libnvidia-glcore.so.290.10 (0x00007fad82a4a000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fad8282e000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fad825f1000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fad823ec000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fad821c2000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fad81fbe000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fad81db8000)

我相信还有另一种可能且可能更好的选择。在 Ubuntu 11.04 中,链接器被配置为在/usr/lib/x86_64-linux-gnu/mesa/目录中查找配置文件位于/etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf.

如果编辑此文件以反映不同的路径,则链接器可能会选择该库。链接器的库搜索优先级似乎是:

LD_LIBRARY_PATH=> 位于 => 中的文件/etc/ld.so.conf.d最后求助于在默认路径中搜索库。

在 /etc/ld.so.conf.d 中相应地编辑文件可能是一个更好的解决方案,但在我的情况下,我没有编辑这些文件的权限,所以编辑LD_LIBRARY_PATH就可以了。

于 2012-06-13T19:39:58.873 回答