Я пытаюсь создать небольшое приложение 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
Похоже, что /usr/lib64/libQtGui.so
в них есть жестко запрограммированные rpath для поиска зависимых разделяемых библиотек. На одном из ваших хостов необходимые библиотеки находятся в ожидаемом месте, а на другом — нет.
Вы можете использовать что-то вроде elfdump, чтобы получить RPATH
из общей библиотеки QT, чтобы узнать, где она будет выглядеть. Тогда вы можете использовать (я считаю) -R
в командной строке ссылки, чтобы указать, где находятся библиотеки на самом деле установлен на этом хосте.
РЕДАКТИРОВАТЬ: Я думаю, что вы можете сделать что-то вроде objdump -x <binary/library> | grep -i rpath
Других решений пока нет …