2012-05-31 3 views
2

У меня есть две библиотеки libGL на той же машине Ubuntu 11.04. Одна библиотека была установлена ​​для видеокарты Nvidia по адресу /usr/lib/libGL.so, другая по умолчанию установлена ​​с Ubuntu, расположенной по адресу usr/lib/x86_64-linux-gnu/mesa/libGL.so.Переопределение выбора OpenGL Qt 4.8.1

Теперь у меня проблема - это библиотека Qt, загружаемая из репозиториев Ubuntu в отношении библиотеки mesa, но я хочу связать ее с библиотекой Nvidia. Это, вероятно, даст лучшую производительность, и при компиляции программы возникли проблемы с использованием libGL mesa. Те, которые были зафиксированы:

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 

Есть вариант, где я могу заставить увязывание конкретной библиотеки вместо другого (в частности, при запуске конфигурационного скрипта)? Я бы предпочел не настраивать компоновщик каким-либо определенным образом. Я бы предпочел не удалить библиотеку mesa.

Если для этого нет такого скрипта сценария configure, существует ли способ установить приоритет библиотек, которые использует компоновщик?

В худшем случае, я мог бы, вероятно, изменить все Make-файлы после запуска ./configure. Grep все дерево Qt для использования -lGL и измените его на /usr/lib/libGL.so. Я чувствую, что это довольно хак.

Update

Некоторый успех. Я сделал grep на дереве Qt для lGL и обнаружил, что другие mkspecs (кроме linux-g++-64) использовали другие переменные для указания пути OpenGL. Поэтому я добавил их mkspec linux-g++-64 «s, вот результат 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 выполнило трюк.