У меня есть динамическая библиотека libtest.dylib, установленная в /PATH/lib
, и исполняемый двоичный файл myapp, который использует dylib, установленный в /PATH/bin
.
Я могу запустить myapp
, чтобы найти dylib следующим образом (Можно ли использовать DYLD_LIBRARY_PATH в Mac OS X? И каков алгоритм поиска в динамической библиотеке?):
DYLD_LIBRARY_PATH="/PATH/lib" myapp
Думаю, я могу использовать install_name_tool
для обновления библиотеки и исполняемого файла, чтобы библиотеку можно было найти с помощью rpath. Я использовал подсказки в этом сообщении - Как я могу указать rpath в дилибе?.
В lib я выполнил эту команду, чтобы добавить rpath.
install_name_tool -id "@rpath/libtest.dylib" libtest.dylib
install_name_tool -add_rpath "@executable_path/../lib/" libtest.dylib
В корзине я выполнил install_name_tool -add_rpath "@executable_path/../lib/" myapp
.
Однако, когда я выполнил myapp
в каталоге bin
, у меня появляются сообщения об ошибках.
dyld: Library not loaded: libtest.dylib
Referenced from: /PATH/bin/./myapp
Reason: image not found
Trace/BPT trap: 5
otool -l myapp
показывает, что rpath правильно обновлен в myapp.
Load command 16
cmd LC_RPATH
cmdsize 40
path @executable_path/../lib/ (offset 12)
То же самое и с libtest.dylib.
Load command 13
cmd LC_RPATH
cmdsize 40
path @executable_path/../lib/ (offset 12)
Что может быть не так?
ДОБАВЛЕН
Конечно, я могу использовать cc -install_name
во время компиляции и компоновки, но я хотел знать, как сделать то же самое, что и при изменении сгенерированного dylib и исполняемого двоичного файла.
Из библиотеки:
cc -install_name "@loader_path/../lib/libtest.dylib" -dynamiclib -o libtest.dylib test.c
Или имя_установки может использовать @rpath:
cc -install_name "@rpath/libtest.dylib" -dynamiclib -o libtest.dylib test.c
Из корзины:
cc -I../lib -c main.c
cc -o main main.o ../lib/libtest.dylib -Wl,-rpath -Wl,@loader_path/../lib
Или всего одна строчка:
cc -I../lib -L../lib -o main main.c -ltest -Wl,-rpath -Wl,@loader_path/../lib