Как автоматически ссылаться на зависимости разделяемой библиотеки

Я пытаюсь создать небольшое приложение Qt (C ++) с графическим интерфейсом в Linux, но оно не может быть собрано из-за многочисленных ошибок компоновщика, жалуясь на отсутствие зависимостей для библиотеки Qt, с которой я ссылаюсь. Я использовал ldd в библиотеках Qt, чтобы убедиться, что библиотеки действительно есть — и они есть.

Кажется, моя проблема связана с обсуждением в этой теме:
Связывание зависимостей разделяемой библиотеки
И хотя эта ветка помогла мне определить мою конкретную проблему, похоже, что эта ветка заключалась в том, что мое приложение должно ссылаться!

Приложение компилируется с помощью следующей команды:

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread

Выполнение этого генерирует предупреждения следующей формы, и в конечном итоге связывание завершается ошибкой с неопределенными ссылочными ошибками (с символами, определенными в «отсутствующих» библиотеках):

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)

и так далее (всего есть 18 зависимостей, которые не могут быть найдены.)

Я могу получить это для компиляции, если я пойду и явно добавлю -lglib, -lpng14, -lz -lfreetype и так далее, но, как я уже упоминал, существует 18 зависимостей — и я бы предпочел этого не делать. Также кажется, что мне не следовало этого делать.

Я скомпилировал тот же проект на своем ноутбуке, который использует тот же Linux Distro (openSuse 12.2) без каких-либо проблем. Все библиотеки, включая Qt, были установлены из репозиториев дистрибутивов.

Я думаю, что это может быть какая-то проблема установки при моей установке openSuse, но я понятия не имею, с чего начать искать, чтобы это исправить.

Ура,
Craig

5

Решение

Похоже, что /usr/lib64/libQtGui.so в них есть жестко запрограммированные rpath для поиска зависимых разделяемых библиотек. На одном из ваших хостов необходимые библиотеки находятся в ожидаемом месте, а на другом — нет.

Вы можете использовать что-то вроде elfdump, чтобы получить RPATH из общей библиотеки QT, чтобы узнать, где она будет выглядеть. Тогда вы можете использовать (я считаю) -R в командной строке ссылки, чтобы указать, где находятся библиотеки на самом деле установлен на этом хосте.

РЕДАКТИРОВАТЬ: Я думаю, что вы можете сделать что-то вроде objdump -x <binary/library> | grep -i rpath

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]