Нужна помощь с общими библиотеками - PullRequest
1 голос
/ 17 июля 2009

У меня есть приложение, которое я построил (на linux, написанном на c ++, компилируемом с g ++), которое использует разделяемые библиотеки, оно прекрасно работает, когда я запускаю его локально, поскольку можно найти общие библиотеки, однако при запуске в кластере, где библиотеки установлены только на головных узлах, я получаю сообщение об ошибке:

. / Start: ошибка при загрузке общих библиотек:

Есть ли переключатель компилятора, который включил бы все разделяемые библиотеки в исполняемый файл и, таким образом, решил проблему обновления всего кластера?

спасибо

Найджел.

Ответы [ 2 ]

1 голос
/ 17 июля 2009

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

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

g ++ -Wl, rpath, full_path_to_libraries

Это будет встроенный путь к самому двоичному файлу. Если rpath не используется, компилятор будет искать переменную окружения LD_RUN_PATH используется во время компиляции:

export LD_RUN_PATH = full_path_to_libraries (для bash)

g ++ .... (компилировать)

Мое личное предпочтение - rpath, поскольку путь встроен в ваш код (например, makefile), и если вы используете систему контроля версий, вы всегда можете узнать, какой путь был использован.


Существуют также альтернативы для указания пути к библиотекам во время выполнения. Первый - установить переменную окружения LD_LIBRARY_PATH . Вы можете установить его несколькими способами:

  • указывает LD_LIBRARY_PATH в самой командной строке

    ~: LD_LIBRARY_PATH = full_path_to_libraries my_application

  • установить LD_LIBRARY_PATH один раз в ~ / .bashrc, в / etc / profile или в командной строке (экспорт LD_LIBRARY_PATH = путь (для bash)), а затем выполнить приложение
  • в качестве суперпользователя добавьте путь к библиотекам в файле / etc / ld.so.conf и выполните утилиту ldconfig . После этого вы можете выполнить ваше приложение, и ваши библиотеки будут расположены (см. Man ldconfig)
1 голос
/ 17 июля 2009

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

Сделайте это на этапе связывания: -Wl, -static -lyourlib -Wl, -Bdynamic

Это должно ссылаться на yourlib статически и на любые другие библиотеки динамически.

...