我在同一台 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++-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 不是这种情况。