Как я могу связать общий объект в C? - PullRequest
2 голосов
/ 16 декабря 2011

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

gcc -o libmylib.so libmylib.c -shared -fPIC -Wall

gcc -o program program.c -L. -lmylib -ldl -Wall

Когда я впервые попытался запустить программу, она сказала что-то вроде

cannot open libmylib.so: no such file or directory

, поэтому я искал в Интернетеобнаружил, что для запуска программы мне нужно скопировать общий объект в /lib/i386-linux-gnu/.Я так и сделал, и это сработало, но затем я попытался сделать это другими способами, и поэтому я удалил libmylib.so из каталога /lib/i3686-linux-gnu/.Теперь, когда я пытаюсь запустить программу, она не показывает ошибок, но продолжает говорить Segmentation fault.Понятно, что общего объекта нигде не найти, но как мне связать его, не копируя ничего?

Я использую Ubuntu 11.10

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Подробнее о общих библиотеках и их путях поиска , а также команде ld .

Альтернативой может быть регистрация "runtime "путь, используемый для поиска библиотеки.Вы можете использовать gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall

Если ваша программа dlopen -ing во время выполнения какого-либо файла *.so, вам лучше передать абсолютное имя файла в dlopen (или что-то ещекак "./foo.so").Вам может помочь функция realpath .

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

Существуют причины безопасности (аналогичные PATH), позволяющие избежать помещения текущего каталога в путь времени выполнения или LD_LIBRARY_PATH.

.
2 голосов
/ 16 декабря 2011

Когда вы скомпилировали программу, вы правильно связали ее; используя -L. -lmylib. Однако, если это не стандартная системная библиотека, среда выполнения должна знать, где ее искать. Один из способов сделать это - использовать переменную окружения LD_LIBRARY_PATH, например:

LD_LIBRARY_PATH=. ./program

или

export LD_LIBRARY_PATH=.
./program
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...