2017-02-10 1 views
1

У меня есть следующая проблема: Я пытаюсь создать переносимую версию моей программы, поэтому я установил rpath в " «. поэтому все библиотеки связаны с использованием относительного пути к файлу. И это работает для всех библиотек, кроме одного. По какой-то причине программа работает только в том случае, если одна конкретная библиотека присутствует в той же позиции, с которой она была связана, когда она была скомпилирована. Это тот, который я написал сам, у которого также есть свой путь к «.». Таким образом, программа откажется запускаться, даже если библиотека находится в том же месте, что и исполняемый файл.
Я проверял, что проблема в том, что только одна библиотека, потому что, если я создам папку, в которой на моем компьютере на компьютере установлена ​​программа libry, программа запустится.Linux C++ пытается загрузить одну конкретную библиотеку, используя абсолютный путь, в то время как все остальные связаны с относительным

linux-vdso.so.1 => (0x00007ffcc5961000) 
libOgreHlmsPbs.so.2.1.0 => ./libOgreHlmsPbs.so.2.1.0 (0x00007fedeec3f000) 
libOgreHlmsUnlit.so.2.1.0 => ./libOgreHlmsUnlit.so.2.1.0 (0x00007fedeea1d000) 
libOgreMain.so.2.1.0 => ./libOgreMain.so.2.1.0 (0x00007fedee194000) 
/home/marvin/workspace/HLMS_DS_DEMO/libHLMS_DS.so => not found 

Так ли кто-нибудь есть идея, что может привести к Linux пытается найти библиотеку в первоначальном месте, а не в относительном один, как все остальные? Также программа отлично работает на окнах.

+0

Вы хотите установить rpath относительно текущего каталога ('$ PWD') или относительного места выполнения? – yugr

+0

Почему бы не просто следовать правилам -I? [Параметры каталога GCC] (https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options) – Ripi2

+0

относительно исполняемого местоположения оптимально – user2741831

ответ

1

Я поставил RPATH в . так все библиотеки связаны с использованием относительного пути к файлу

Использование . в RPATH является плохой идеей:

  • Юзабилити: приложение должно запускаться из определенный рабочий каталог.
  • Безопасность: злоумышленник может поместить модифицированные файлы .so в другой каталог и запустить приложение оттуда.

Правильный способ - использовать функцию -rpath=$ORIGIN. См man ld.so:

$ ORIGIN (или, что эквивалентно $ {} ORIGIN) Это расширяет в каталог, содержащий программу или общий объект. Таким образом, приложение, расположенное в somedir/приложение может быть скомпилирован с

gcc -Wl,-rpath,'$ORIGIN/../lib' 

так, что он не находит соответствующий общий объект в somedir/Lib независимо от того, где somedir находится в иерархии каталогов. Это облегчает создание приложений «под ключ», которые не нужно устанавливать в специальные каталоги, но вместо этого могут быть распакованы в любой каталог и все еще найти свои собственные общие объекты.

$ORIGIN синтаксис немного неудачно, потому что он получает разложено в переменной, как make и bash, так что вам, возможно, придется процитировать его соответствующим образом.


, что может привести к Linux пытается найти библиотеку в первоначальном месте, а не в относительном один, как все остальные

При компоновке, библиотека может быть определена как -lmylib или -l:libmylib.so или -l<path>/libmylib.so. В последнем случае компоновщик времени выполнения ищет библиотеку только в этом конкретном пути <path>/libmylib.so. См. man ld, опцион -l для получения полной информации. Вы можете просмотреть свои команды компоновщика системы сборки.

+0

Я использую eclipse cdt, поэтому я посмотрю вывод. спасибо за вашу помощь – user2741831

+0

это не помогает, я хочу портативное приложение, то есть пользователь должен иметь возможность разместить папку в любом месте и просто выполнить программу. Его использовали внутри, поэтому не волнуйтесь, я посмотрю на оставшуюся часть вашего ответа, чтобы узнать, помогает ли это – user2741831

+0

Я просто попробовал Ldd, но странно, каждая другая библиотека загружается динамически, а моя загружается с абсолютным путем , Я отправил вывод ... – user2741831

Смежные вопросы