Статическая ссылка на динамическую библиотеку. Glibc - PullRequest
4 голосов
/ 15 января 2009

Итак. У меня проблема с двумя версиями GCC на компьютере.
3.4.6 и 4.1

Это связано с некоторыми проблемами зависимости с новым программным обеспечением. (требуется glibc 4.1)

Когда я иду, чтобы связать это новое программное обеспечение с библиотеками 4.1, оно связывает нормально. Тем не менее, когда дело доходит до выполнения программного обеспечения, оно не может найти библиотеку, потому что оно смотрит на 3.4.6 в моем LD_LIBRARY_PATH. Если я установлю LD_LIBRARY_PATH на 4.1 lib, это взорвет оболочку, среди прочего, убивая другие, потому что для этого используются библиотеки 3.4.6.

Немного подвох 22.

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

Таким образом, я могу иметь обе версии, но использовать только 4.1 для этого конкретного приложения?

Ответы [ 3 ]

7 голосов
/ 15 января 2009

Вы имеете в виду абсолютный путь, который используется при запуске программы и который предпочтителен при поиске библиотек? rpath именно так. Он перезапишет путь поиска по умолчанию и материал, заданный в LD_LIBRARY_PATH. Просто скажите gcc передать его компоновщику:

g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp

Вы можете настроить отображение поиска (используйте help, чтобы предоставить вам больше возможностей):

[js@HOST2 cpp]$ LD_DEBUG=libs ./a.out
  5859:     find library=libc.so.6 [0]; searching
  5859:      search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686:
               /usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls:
               /usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686:
               /usr/lib/my_4.1/sse2:/usr/lib/my_4.1  (RPATH from file ./a.out)
  5859:       trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6
  5859:       ....
  5859:      search cache=/etc/ld.so.cache
  5859:       trying file=/lib/libc.so.6  (note: found here!)
  5859:
1 голос
/ 15 января 2009

на самом деле не ответ на ваш вопрос, а альтернативное решение:

вы сможете исправить свои проблемы, добавив новый путь к lib к /etc/ld.so.conf и запустив ldconfig от имени пользователя root.

0 голосов
/ 16 октября 2010

Не можете ли вы установить LD_LIBRARY_PATH только для приложения, которое нуждается в этом? То есть вместо того, чтобы устанавливать его глобально как экспортируемую переменную, запустите вашу программу как

LD_LIBRARY_PATH = / path / to / 4.1 / libs my_executabel

-k

...