Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: OfirDОтветов: 2

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

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)

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

gcclinuxlinkerloader

Ответы

Ответ 1 · рейтинг 2 · Peter Silon

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

Ответ 2 · Basile Starynkevitch

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы