Опция -L
предназначена для компоновщика ld
, чтобы найти .a
и .so
во время компоновки.
Параметр -Wl,-rpath=
предназначен для динамического компоновщика ld.so, чтобы найти .so
при запуске приложения.Вам необходимо использовать -Wl,-rpath=
, когда необходимая общая библиотека не находится в (стандартной системе) каталогах, указанных в /etc/ld.so.conf
.
Использовать $ORIGIN
динамический компоновщик переменную, чтобы сделать rpath относительнопуть к вашему исполняемому файлу:
g++ -L../../lib -Wl,-rpath='${ORIGIN}/../../lib' -o my_prog my_prog.cpp -ltest1 -ltest2
Будьте осторожны, чтобы убедиться, что ${ORIGIN}
не раскрыт оболочкой или вашим make-файлом (вот почему он заключен в одинарные кавычки).
${ORIGIN}
:
$ORIGIN
и rpath
ld.so
понимает строку $ORIGIN
(или эквивалентно ${ORIGIN}
) в спецификации rpath (DT_RPATH
или DT_RUNPATH
) для обозначения каталога, содержащего исполняемый файл приложения.Таким образом, приложение, расположенное в somedir / app, может быть скомпилировано с gcc -Wl,-rpath,'$ORIGIN/../lib'
, так что оно находит связанную разделяемую библиотеку в somedir / lib независимо от того, где somedir находится в иерархии каталогов.Это облегчает создание приложений «под ключ», которые не нужно устанавливать в специальные каталоги, но вместо этого их можно распаковать в любой каталог и найти собственные разделяемые библиотеки.