#gcc
#gcc
Вопрос:
Рассмотрим две приведенные ниже команды для создания простого исполняемого файла
$ gcc -g -Wall -Wl,--enable-new-dtags -Wl,-rpath,'$ORIGIN'/sharedLibDir -o prog main.c ./sharedLibDir/libdemo.so
$ gcc -g -Wall -Wl,--enable-new-dtags -Wl,-rpath,./sharedLibDir -o prog main.c ./sharedLibDir/libdemo.so
Очевидно, что один использует локальный каталог в качестве RPATH, другой использует $ORIGIN . Я не вижу, в чем разница между этими двумя (кроме значения RPATH и RUNPATH в двоичном файле); оба позволяют перемещать исполняемый файл и, при условии, что у него есть параллельный каталог с именем sharedLibDir, он запускается.
В чем смысл $ORIGIN? Есть ли у него какая-то дополнительная функциональность, которую я пропустил? Заранее спасибо.
Ответ №1:
При вашем использовании $ORIGIN
поиск выполняется относительно каталога, содержащего исполняемый файл. Если вы указываете относительный каталог, он относится к текущему рабочему каталогу, что вряд ли когда-либо является тем, что вам нужно.
Комментарии:
1. Спасибо; Я не знал, что существует местоположение «install» как таковое — я скоро посмотрю это.
2. Местом установки является просто каталог, содержащий исполняемый файл. Извините, что смутил вас, я перефразирую свой ответ.
3. Итак, когда текущий рабочий каталог перестанет быть каталогом, содержащим исполняемый файл??
4. Ну, если вы откроете терминал и запустите
ls
, текущим рабочим каталогом будет/home/Wad
, но каталог, содержащийls
исполняемый файл, является/bin
.5. Как насчет того, когда задействованы символические ссылки? Это все еще каталог исполняемого файла или каталог символической ссылки?