@Selby

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

Хочется разобраться с темой компиляции и линковки в Си (вообще, и на linux в частности).
Для примера я сделал свою небольшую обертку над SDL2, которую хочу собрать в shared library.

Файлы библиотеки: window.h и window.c.
Файлы программы, к которой должна подключаться библиотека: main.c.
Всё в одной директории.

Для демонстрации логики моих действий, приведу фрагмент из Makefile:
$(APP):
	@./$(APP)

compile:
	@$(CC) main.c window.c $(FLAGS) -lSDL2 -o $(APP)

build:
	$(CC) window.c -c -fPIC
	$(CC) window.o -shared -lSDL2 -o libwindow.so
	$(CC) main.c -c -o main.o
	$(CC) main.o -L. -lwindow -o $(APP)


Вариант с компиляцией программы в лоб (compile:) работает как надо.
А вариант с созданием динамической библиотеки (build:) и подключением ее к программе - не работает.

При попытке запуска программы, выводится:
./app: error while loading shared libraries: libwindow.so: cannot open shared object file: No such file or directory


Вопрос: Что я делаю не так? :)

p.s. гугля, находил предложения с LD_LIBRARY_PATH=... . Но разве флаг -L при компиляции не служит той же самой цели?
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
гугля, находил предложения с LD_LIBRARY_PATH=... . Но разве флаг -L при компиляции не служит той же самой цели?

нет, не служит. -L говорит о том, где искать любые библиотеки во время линковки приложения. LD_LIBRARY_PATH говорит о том, где искать динамические библиотеки во время выполнения. Информация из -L со времени линковки нигде не сохраняется. Можно зашить в слинкованный бинарник пути к библиотекам, но это делается другими опциями (см. опцию линкера -rpath). Во время выполнения динамические библиотеки могут быть где угодно, не обязательно там, где они были во время линковки.

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

вопрос, кстати, неправильный. Ты создал такую библиотеку. Если ты посмотришь в вывод readelf -d libwindow.so | grep NEEDED то там должна быть ссылка на libSDL. Твоя проблема в том, что сама libwindow.so не найдена.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы