2012-05-31 84 views
2

我在同一個Ubuntu 11.04機器上有兩個不同的libGL庫。一個庫被安裝在Nvidia顯卡的/usr/lib/libGL.so另一個是默認安裝在Ubuntu上的,位於usr/lib/x86_64-linux-gnu/mesa/libGL.so覆蓋Qt 4.8.1的OpenGL選擇

現在,我遇到的問題是從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運行後更改所有的Makefiles。 grep整個Qt樹使用-lGL並將其更改爲/usr/lib/libGL.so。我覺得這是一個相當黑客。

更新

了一些成功。我在lg的Qt樹上做了一個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的情況。

回答

0

鏈接器需要重新配置才能找到正確的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沒有辦法。