【问题标题】:Overriding Qt 4.8.1's OpenGL Selection覆盖 Qt 4.8.1 的 OpenGL 选择
【发布时间】:2012-05-31 18:56:54
【问题描述】:

我在同一台 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。不过,我觉得这是一个相当不错的 hack。

更新

有些成功。我在 Qt 树上为 lGL 做了一个 grep,发现其他 mkspecs(除了linux-g++-64)使用其他变量来指定 OpenGL 路径。所以我将它们添加到linux-g++-64 的mkspec 中,这是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 不是这种情况。

【问题讨论】:

    标签: qt linker shared-libraries ubuntu-11.04 dynamic-linking


    【解决方案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 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2012-10-31
      相关资源
      最近更新 更多