2012-05-31 3 views
2

동일한 Ubuntu 11.04 시스템에 두 개의 서로 다른 libGL 라이브러리가 있습니다. 하나의 라이브러리가 Nvidia의 그래픽 카드 용으로 설치된 곳은 /usr/lib/libGL.so이고, 다른 하나는 우분투와 함께 설치된 기본값 인 usr/lib/x86_64-linux-gnu/mesa/libGL.so입니다.Qt 4.8.1의 OpenGL 선택 덮어 쓰기

이제 문제는 메사 라이브러리에 대한 Ubuntu의 저장소 링크에서 다운로드 한 Qt 라이브러리이지만 Nvidia의 라이브러리에 링크하려고합니다. 이것은 아마도 더 나은 성능을 제공 할 것이고 프로그램을 컴파일 할 때 메사의 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 스크립트가 실행되는 특별히 때) 다른 사람의 특정 라이브러리의 연결을 강제 할 수있는 옵션이 있습니까? 필자는 특정 방식으로 링커를 구성하지 않는 것을 선호합니다. 나는 또한 메사 라이브러리를 제거하지 않을 것입니다.

그런 구성 스크립트 플래그가 없으면 링커에서 사용하는 라이브러리의 우선 순위를 설정할 수 있습니까?

최악의 경우라면 ./configure을 실행 한 후에 모든 Makefile을 변경할 수 있습니다. Qt 트리 전체를 grep하여 -lGL을 사용하고 /usr/lib/libGL.so으로 변경하십시오. 나는 이것이 상당히 해킹된다고 느낀다.

업데이트

일부 성공. 나는 lGL에 대한 Qt 트리에서 grep을 수행했으며 다른 mkspecs (linux-g++-64 외)이 다른 변수를 사용하여 OpenGL 경로를 지정한다는 것을 알았습니다.

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

그래서 내가 직접 제대로 연결 것이라고 생각하고 싶었던 라이브러리 경로를 설정 : 그래서 여기 mkspec/linux-g++-64/qmake.conf의 결과이다, linux-g++-64의 mkspec에 추가. 실제로 컴파일하는 동안 좋은 소식이었습니다. -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에 대한 올바른 라이브러리를 찾으려면 링커를 다시 구성해야합니다.그러한 선택 사항 중 하나는 자주 사용하는 openGL 라이브러리의 경로를 포함하도록 LD_LIBRARY_PATH 변수를 변경하는 것입니다. 내 경우에는 /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에서 링커는 /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf에있는 구성 파일을 사용하여 /usr/lib/x86_64-linux-gnu/mesa/ 디렉토리를 찾습니다.

다른 경로를 반영하도록이 파일을 편집하는 경우 링커에서 대신 해당 라이브러리를 선택합니다. 링커의 라이브러리 검색 우선 순위는 다음과 같습니다. /etc/ld.so.conf.d => 마지막으로 기본 경로에서 라이브러리를 검색하는 데 의존하는 라이브러리 검색 우선 순위는

LD_LIBRARY_PATH =>입니다.

/etc/ld.so.conf.d에서 파일을 편집하는 것이 더 좋은 해결책 일 수 있지만, 제 경우에는 편집 할 수있는 권한이 없습니다. LD_LIBRARY_PATH이 트릭을했습니다.