Как получить RPATH с $ORIGIN для работы над Code:: Blocks GCC?
Я пытаюсь связать RPATH, содержащий специальную строку $ORIGIN, в исполняемый файл, построенный с помощью GCC, с IDE Code::Blocks. Я указал
-Wl,-R$ORIGIN
в параметрах компоновщика для проекта, но вывод командной строки в GCC неправильный (очищен для ясности):
g++ -Wl,-R
Как правильно указать этот аргумент для Code:: Blocks?
3 ответов
тот, кто решил сделать токен $ ORIGIN, является злым ублюдком, который заслуживает особого места в программистском аду. Поскольку " $ " - это специальный символ для bash и других скриптовых языков, таких как make, он все испортит, если тщательно не убежит. Хуже того, в зависимости от того, какую среду сборки вы используете, специфика того, как правильно убежать, вероятно, изменится.
в bash вам нужно вставить обратную косую черту перед$:
-Wl,-R$ORIGIN
Код::Блоки по-видимому, также рассматривает $ как особый. Затем любой контроллер подпроцесса Code:: Blocks отправляет команду для обработки обратной косой черты как специальной. Таким образом, как обратная косая черта, так и $ должны быть удвоены, чтобы правильно убежать. Поэтому в настройках компоновщика Code::Blocks необходимо указать:
-Wl,-R\$$ORIGIN
...выходы:
-Wl,-R\$ORIGIN
...в журнал сборки, но оболочка фактически отправляется:
-Wl,-R$ORIGIN
...который, как упоминалось выше, производит нужные результат.
Какая боль.
в дополнение к ответу kblucks, который касается вопроса для Code: Blocks.... Для таких, как я, кто наткнулся на эту страницу, ища, как это сделать с Make. Трюк состоит в том, чтобы использовать дополнительный знак $ в качестве escape-символа и заключать его в кавычки:
-Wl,-R,'$$ORIGIN/../lib'
полное объяснение можно здесь: использование ORIGIN для динамического пути поиска библиотеки времени выполнения
Если ваш исполняемый файл создается огромной сложной средой скрипта, не созданной вами, и вы не хотите углубляться в это, пытаясь работать с setenv LD_RUN_PATH='$ORIGIN/../lib'
; если это не работает, прагматический подход заключается в создании оболочки для ld:
#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"
... затем сделайте сборку с этим заглушкой на пути. На практике это можно назвать строительством .таким образом, файлы или другие исполняемые файлы, поэтому вам может потребоваться сделать этот более сложный скрипт, который решает, вставлять ли RPATH. Или запустите строить без этого, и С, и сливки.
(здесь "/ usr/bin / ld" - это ld, который обычно запускался, который может быть где-то еще. gcc может не забрать ld из пути, см. переменные среды gcc для переопределения этого. Пробег может отличаться. Только однократное использование. Не оправдано быть менее ужасным, чем любой другой подход).