загрузка общей библиотеки из любого каталога

Я играю с процедурами связывания и загрузки общих библиотек и пытаюсь узнать о различных способах устранения ошибки загрузки:

error while loading shared libraries: ... : cannot open shared object file: No such file or directory

Мне удалось решить эту проблему, используя LD_LIBRARY_PATH и rpath. Теперь я пытаюсь понять, как использовать ldconfig и как он может решить эту проблему [некоторые из моих веб-источников: 1, 2, 3]

Итак, у меня есть следующие исходные файлы: test.c func1.c func2.c. Вот что я делаю:

  1. Компиляция их в файлы PIC .obj:

$ gcc -Wall -fPIC -c *.c

  1. Создание общей библиотеки из объектных файлов с именем «libshared.so» и использованием «soname»:

$ gcc -shared -Wl,-soname,libshared.so -o libshared.so *.o

  1. Связывание с общей библиотекой, указав GCC, где найти общую библиотеку (... — это просто аббревиатура пути к моей личной общей библиотеке):

$ gcc -L/home/.../my_shared_library -Wall -o mytest test.c -lshared

  1. Теперь я пытаюсь запустить его и получаю ошибку загрузки:

./mytest: error while loading shared libraries: libshared.so: cannot open shared object file: No such file or directory

  1. Поэтому я пытаюсь сказать загрузчику искать в моем личном каталоге файл общей библиотеки:

ldconfig -n home/.../my_shared_library

(Я также пробовал это с: ldconfig -n .-L, когда мой рабочий каталог находится дома/.../my_shared_library)

и попытался запустить его еще раз, но я все еще получаю ту же ошибку. Что я делаю неправильно?


person OfirD    schedule 29.02.2016    source источник


Ответы (2)


arrow_upward
2
arrow_downward

Используйте GNU Libtool, чтобы упростить процесс и избежать таких ошибок. Также используйте опцию -fPIC при создании библиотеки.

person Peter Silon    schedule 29.02.2016
comment
Спасибо за этот инструмент, я не был знаком с ним. Однако я хочу использовать «прямую» команду оболочки, в частности ldconfig, и не скрывать сложности использования общих библиотек. - person OfirD; 29.02.2016

arrow_upward
0
arrow_downward

Прочтите Program Library HowTo и документ Дреппера: Как писать общие библиотеки

Возможно, вы захотите установить rpath. См. этот вопрос.

Вы можете загрузить свой подключаемый модуль во время выполнения с помощью dlopen(3). . Обратите внимание, что общие пути к объектам без / обрабатываются особым образом.

person Basile Starynkevitch    schedule 29.02.2016
comment
руководство HowTo является одним из моих источников обучения, и я дал ссылку на конкретную страницу, на которой обсуждается содержание моего вопроса. Я знаком с rpath, как я уже писал, но я хочу, чтобы все работало с помощью ldconfig (Как писать общие библиотеки также не помогает в этом). - person OfirD; 29.02.2016
comment
Но вы не устанавливаете rpath. Я бы поставил один раз /usr/local/lib/ в /etc/ld.so.conf, поставил библиотеку под /usr/local/lib/ и запустил ldconfig - person Basile Starynkevitch; 29.02.2016
comment
Ну, насколько я понимаю, ldconfig -n <my personal directory> должен позволить загрузчику искать указанный каталог после моей общей библиотеки, без необходимости помещать ее в /usr/local/lib и без необходимости использовать rpath. Это понимание проистекает из некоторого чтения, и вот один пример: Вы можете использовать флаг gcc -L в простых случаях. Вы можете использовать ``rpath'...' (отсюда [ссылка] tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html) - person OfirD; 29.02.2016