2009-07-17 4 views
1

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

./start: ошибка при загрузке разделяемых библиотек:

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

спасибо

Nigel.

+0

Включая их означает, что они больше не разделены, вы можете просто связать пабы, а не использовать общие библиотеки? – beggs

ответ

1

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

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

Это должно связать с YOURLIB статически, а также любые другие LIBS динамически.

1

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

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

г ++ -Wl, RPATH, full_path_to_libraries

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

экспорта LD_RUN_PATH = full_path_to_libraries (для Баш)

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

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


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

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

    ~: LD_LIBRARY_PATH = full_path_to_libraries my_application

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