Я заметил, что многие люди, в том числе и я, не совсем точно знают обоснование и намерение использовать пути поиска линкера: «путь к библиотеке», «rpath» и «rpath-link». Кто-нибудь может объяснить это нам?
После всех моих чтений я склонен думать, что «пути к библиотеке» и «rpath» должно быть достаточно. Обоснование и предполагаемое использование rpath-link для меня загадка. Позвольте мне объяснить, почему.
Установка ‘library-path’ передает указанные пути компоновщику для поиска библиотек по указанным путям в время ссылки (/ сборки).
Установка ‘rpath’ сохраняет указанные пути во встроенном исполняемом файле, компоновщик впоследствии просматривает указанные пути при запуске приложения, т.е. время выполнения.
Таким образом, если ваши библиотеки находятся в нестандартных местах, вам нужно указать «путь к библиотеке» для сборки исполняемого файла и «rpath» для его запуска.
Теперь документация компоновщика GNU гласит: «Разница между -rpath и -rpath-link заключается в том, что каталоги, заданные параметрами -rpath, включаются в исполняемый файл и используются во время выполнения, тогда как параметр -rpath-link действует только во время компоновки. «
Это поднимает два вопроса:
1) Если «r» в «rpath-link» означает «время выполнения», то имя «rpath-link» кажется вводящим в заблуждение, поскольку оно используется в время ссылки.
2) Я уже указал свои библиотечные каталоги для время ссылки в «пути к библиотеке». Я не вижу смысла в «rpath-link». Странная реальность: от http://www.kaizou.org/2015/01/linux-libraries/ Я знаю, что «путь к библиотеке» не используется для вторичных зависимостей (зависимости от одной общей библиотеки к другой общей библиотеке). Чтобы разрешить эти вторичные зависимости, вам нужно установить «rpath» или «rpath-link». Мой вопрос: по какой причине вы не можете использовать «путь к библиотеке» для также указать вторичные зависимости и вместо этого обязаны использовать ‘rpath-link’?
У меня есть исполняемый файл с именем app, который хочет использовать функциональность из liba.so, поэтому я связал приложение с liba.so. liba.so зависит от libb.so. И liba.so, и libb.so находятся в каталоге mylibs. Когда я захотел собрать свой исполняемый файл, я наткнулся на сообщение:
/usr/bin/ld: warning: libb.so.80, needed by /.../liba.so, not found (try using -rpath or -rpath-link)
Далее следуют несколько неопределенных ошибок ссылок.
Чтобы правильно построить его, я должен установить и «library-path» и «rpath-link» (или «rpath») для каталога mylibs. Меня удивляет, почему «путь к библиотеке» также не используется для поиска вторичной зависимости libb.so, и что для поиска этой вторичной зависимости необходимо установить дополнительную ссылку «rpath-link».
Связанный вопрос:
Обоснование -rpath-link
Задача ещё не решена.
Других решений пока нет …