Как я упоминал в своих главных комментариях, используйте -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 будет сгенерирован а не. Вот в чем проблема.
Вы делаете
-lfoo
, но он жалуется на отсутствиеliblfoo.so
вместоlibfoo.so
. Где-то опечатка?@CraigEstey Да, это опечатка, сделанная при рефакторинге, чтобы показать пример.
Рассмотрите возможность использования
-rpath
с (или вместо)-L
Вы можете посмотреть вывод
readelf -a test
, чтобы увидеть, в каких каталогах будет производиться поиск.@CraigEstey Я выполнил эту команду, но не смог найти ни одного каталога.