LINUX.ORG.RU

Qt, изменение списка подключенных библиотек


0

1

Программа нормально запускается из Qt Creator'a, но после того, как я собрал программу в режиме релиза и пытаюсь запустить, вылетает ошибка (symbol lookup error), которая возникает из-за ошибок с зависимостями. В чем именно проблема, я уже выяснил. К проекту подключены одновременно две разные версии библиотек qwt, в которых есть различия, о которые и спотыкается бинарник (по непонятным причинам Qt Creator просто делает правильный выбор в пользу нужной мне версии). Одну из них из проекта надо удалить.

Команда

ldd ./myapp | grep qwt

Выдает

libqwt.so.6 => /usr/lib/libqwt.so.6 (0x00007fbefbcd1000)

Но эта библиотека мне не нужна. Вместо этой мне нужна библиотека из каталога /usr/local/qwt-6.1.0/lib/.

Как это исправить? Знаю только как добавлять библиотеки в проект, но не удалять.

Удалять старую версию не вариант, она установлена из репозиториев и в ней есть плагин для работы с Qt Designer, который у меня для более новой версии не удалось настроить вручную.

P.S. qwt 6.1.0 подключена следующим образом (в файле .pro)

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../usr/local/qwt-6.1.0/lib/release/ -lqwt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../usr/local/qwt-6.1.0/lib/debug/ -lqwt
else:symbian: LIBS += -lqwt
else:unix: LIBS += -L$$PWD/../../../../../usr/local/qwt-6.1.0/lib/ -lqwt

INCLUDEPATH += $$PWD/../../../../../usr/local/qwt-6.1.0/include
DEPENDPATH += $$PWD/../../../../../usr/local/qwt-6.1.0/include

Вероятно, надо исправить содержимое этих переменных (LIBS, INCLUDEPATH, DEPENDPATH). Как это сделать?

Выдает

libqwt.so.6 => /usr/lib/libqwt.so.6 (0x00007fbefbcd1000)

эта библиотека мне не нужна. Вместо этой мне нужна библиотека из каталога /usr/local/qwt-6.1.0/lib/.

Тогда кури настройки /etc/ld.so.conf (не забудь запустить ldconfig опосля), переменную окружения LD_LIBRARY_PATH и LD_PRELOAD - в зависимости от того, что тебе нужно. В Qt Creator работает как раз потому, что он эти переменные выставляет.

asaw ★★★★★
()
Ответ на: комментарий от asaw

Тогда кури настройки /etc/ld.so.conf (не забудь запустить ldconfig опосля), переменную окружения LD_LIBRARY_PATH и LD_PRELOAD - в зависимости от того, что тебе нужно. В Qt Creator работает как раз потому, что он эти переменные выставляет.

Но ведь тогда работать будет только у меня, правда ведь?

LIBS += -L/usr/local/qwt-6.1.0/lib -lqwt
QMAKE_LFLAGS += '-Wl,-rpath,/usr/local/qwt-6.1.0/lib' '-Wl,--rpath-link,/usr/local/qwt-6.1.0/lib'

Большое спасибо, но хотелось бы понять, что это значит. Какой ман читать? (в man qmake не нашёл нужных тегов, нагуглить тоже не получилось)

Gorthad
() автор топика
Ответ на: комментарий от Gorthad

Но ведь тогда работать будет только у меня, правда ведь?

Если то же самое будут проделывать и пользователи, то не только. Весь вопрос в том, откуда должна браться библиотека /usr/local/qwt-6.1.0. Если из дистрибутива, то тогда с ней нужно и компилировать, и линковать. Если нет, то тогда лучше линковаться со статической версией.

Какой ман читать?

man ld

asaw ★★★★★
()
Ответ на: комментарий от Gorthad

Какой ман читать?

man ld

-L/usr/local/qwt-6.1.0/lib указывает компоновщику добавить /usr/local/qwt-6.1.0/lib в список каталогов для поиска библиотек.

-Wl,-rpath,/usr/local/qwt-6.1.0/lib добавляет /usr/local/qwt-6.1.0/lib в список поиска библиотек времени выполнения (runtime library search path, если по-английски). Благодаря этому всё и работает.

-Wl,--rpath-link,/usr/local/qwt-6.1.0/lib — это на случай, если одна ли линкуемых библиотек имеет (неявную) зависимость от qwt; тогда компоновщик сначала будет использовать пути из --rpath-link.

sjinks ★★★
()
Ответ на: комментарий от Adonai

Есть, но если вдруг захочется использовать $ORIGIN (например, если ТС захочет носить свой qwt с собой), QMAKE_RPATHDIR уже не поможет.

sjinks ★★★
()
Ответ на: комментарий от sjinks

Хм, я тогда ещё спрошу, у самого познания явно мельче, чем у Вас.

Подскажите, как заставить плагин Qt искать в кастомных директориях библиотеку? Приведу пример,

у меня есть программа на Qt и QtPluginLoader с парой плагинов. Плагинам для работы нужны проприетарные библиотеки, для каждого плагина разные. Когда я выставляю RPATH для приложения - при подключении плагинов зависимые библиотеки находятся и корректно подгружаются. Но это неправильно с точки зрения архитектуры - правильнее было бы каждому плагину указывать в ELF директории, где могут лежать его зависимости.

Но когда я выставляю RPATH для плагинов, то при их подгрузке приложение не ищет зависимые библиотеки в тех директориях, которые указаны в плагинах (оно и понятно, RPATH ведь RUNTIME<...>, а исполняется основная программа, а не плагин)

Если есть мысли, как архитектурно правильно было бы задать плагину пути поиска, буду премного благодарен. Если нужна ещё какая-нибудь информация, готов предоставить.

Adonai ★★★
()
Ответ на: комментарий от sjinks

Большое спасибо за развернутый ответ! Я относительно недавно пользуюсь Linux, поэтому хотелось бы уточнить: если я собираюсь как-то распространять эту программу (в виде двоичного кода, да и в виде исходников тоже), как грамотнее всего приложить эту библиотеку к программе? Если где-то можно про это почитать, буду благодарен, если укажете, где.

Gorthad
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.