В общей библиотеке отсутствует заголовочный файл, который, как я знаю, существует

avatar
user852541
8 августа 2021 в 21:16
113
2
0

У меня есть структура проекта примерно такая:

>>> ls -R
- whatever
-   libfoo.so
-   foo.h
-   foo.c
-   test2.c
- however
-   test1.c

libfoo.so — это библиотека, test.c — это простая библиотека, которая прямо сейчас включает foo.h и печатает «Hello World!». Я могу скомпилировать с gcc test1.c -o test -std=c2x -L/dir/to/lib -lfoo Но когда я пытаюсь запустить test, я получаю:

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

Что мне делать?

Источник
Craig Estey
8 августа 2021 в 22:12
0

Вы делаете -lfoo, но он жалуется на отсутствие liblfoo.so вместо libfoo.so. Где-то опечатка?

user852541
8 августа 2021 в 22:14
0

@CraigEstey Да, это опечатка, сделанная при рефакторинге, чтобы показать пример.

Craig Estey
8 августа 2021 в 22:24
0

Рассмотрите возможность использования -rpath с (или вместо) -L

Craig Estey
8 августа 2021 в 22:28
0

Вы можете посмотреть вывод readelf -a test, чтобы увидеть, в каких каталогах будет производиться поиск.

user852541
8 августа 2021 в 22:36
0

@CraigEstey Я выполнил эту команду, но не смог найти ни одного каталога.

Ответы (2)

avatar
Elephant88
8 августа 2021 в 22:05
2

Это связано с тем, что ваша общая библиотека не находится в LD_LIBRARY_PATH, просто укажите путь к папке, где находится so file, в ваших переменных среды, вы можете поместить это навсегда в вашем профиле bash, просто поместите следующую команду в файл «.bashrc»:

export LD_LIBRARY_PATH=/home/user/the_folder_you_are_working_on/:$LD_LIBRARY_PATH

или

echo 'export LD_LIBRARY_PATH=/home/user/the_folder_you_are_working_on/:$LD_LIBRARY_PATH' >> ~/.bashrc
user852541
8 августа 2021 в 22:20
0

Если бы я был кем-то, кто публикует программу, что было бы уместно сделать?

ssbssa
8 августа 2021 в 23:30
0

@user852541 user852541 Есть ли причина, по которой вы не можете связать библиотеку статически?

avatar
Craig Estey
8 августа 2021 в 23:22
1

Как я упоминал в своих главных комментариях, используйте -rpath ...

Выполните следующие действия (например):

LIBDIR=/dir/to/lib

gcc test1.c -o test -std=c2x -L$LIBDIR -Wl,-rpath=$LIBDIR -lfoo

Для нескольких библиотек/каталогов, вот пример Makefile:

LIBS += -lmy
LIBS += -lmy2

TOP = /tmp/myall
DIRS += $(TOP)/mylib
DIRS += $(TOP)/mylib2

PATHL := $(addprefix -L,$(DIRS))

PATHR := $(addprefix :,$(DIRS))
PATHR := $(shell echo $(PATHR) | sed -e s/:/-Wl,-rpath=/g)

test:
    cc -o test test.c $(PATHL) $(PATHR) $(LIBS)

clean:
    rm -f test

Вот результат make:

cc -o test test.c -L/tmp/myall/mylib -L/tmp/myall/mylib2 -Wl,-rpath=/tmp/myall/mylib -Wl,-rpath=/tmp/myall/mylib2 -lmy -lmy2

Вот фрагмент readelf -a test:

Dynamic section at offset 0x2df0 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libmy.so]
 0x0000000000000001 (NEEDED)             Shared library: [libmy2.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/tmp/myall/mylib:/tmp/myall/mylib2]

Обратите внимание, что если мы опустим -rpath, раздел RPATH файла ELF будет сгенерирован а не. Вот в чем проблема.