У меня есть динамический libray 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 в dylib?.
В lib я выполнил эту команду, чтобы добавить rpath.
install_name_tool -id "@rpath/libtest.dylib" libtest.dylib
install_name_tool -add_rpath "@executable_path/../lib/" libtest.dylib
В bin я выполнил 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)
Что может быть неправильным?
ADDED
Конечно, я могу использовать cc -install_name
при компиляции и времени ссылки, но я хотел знать, как сделать то же самое, что я модифицировал генератор dylib и исполняемый двоичный файл.
Из lib:
cc -install_name "@loader_path/../lib/libtest.dylib" -dynamiclib -o libtest.dylib test.c
Или имя install_name может использовать @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