У меня есть программа Linux Qt. Я бы хотел, чтобы они преимущественно использовали (динамические) библиотеки Qt в каталоге исполняемого файла, если они существуют, в противном случае используйте Qt libs системы. RPATH на помощь.Настройка порядка RPATH в QMake
добавить эту строку в QMAKE «s .pro файл:
QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
и глядя на получившийся исполняемый файл с readelf Я вижу:
0x000000000000000f (RPATH) Library rpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
кажется правильным, но ldd показывает, что он использует системную версию:
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)
Если я вручную редактировать QMAKE, влекущего Makefile, чтобы поменять порядок двух rpaths, так что $ ORIGIN приходит после того, как/USR/местные/..., я получаю правильное поведение:
0x000000000000000f (RPATH) Library rpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
0x000000000000001d (RUNPATH) Library runpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)
Моя проблема заключается с как qmake создает конечную переменную LFLAGS. Я не могу понять, как заставить его добавить ($ ORIGIN) после системной библиотеки. Есть идеи?
Почему вы предпочитаете местные библиотеки поверх системных библиотек? В обычном сценарии развертывания, когда вы отправляете библиотеки с двоичным кодом, у вас есть локальная или локальная система. –
Я бы не сделал этого для производственного продукта, но он полезен для отладки, где в локальной библиотеке есть дополнительный диагностический результат (например). Я понимаю, что могу просто использовать что-то в строках LD_LIBRARY_PATH в сценарии оболочки, но я сбежал от этой кроличьей дыры QMAke/RPATH, и теперь мне интересно, как заставить QMake делать то, что я хочу ... –