Ответ 1
Из otool -l
я проанализировал, что следует добавить или изменить из исходной библиотеки и двоичного файла.
Dylib
Изменение в id:
Load command 2 <-- OLD
cmd LC_ID_DYLIB
cmdsize 40
name libtest.dylib (offset 24)
time stamp 1 Wed Dec 31 18:00:01 1969
Load command 2 <-- NEW
cmd LC_ID_DYLIB
cmdsize 64
name @loader_path/../lib/libtest.dylib (offset 24)
Это команда для выполнения изменения:
install_name_tool -id "@loader_path/../lib/libtest.dylib" libtest.dylib
Или используйте rpath:
install_name_tool -id "@rpath/libtest.dylib" libtest.dylib
Исполняемый файл
Есть два изменения: rpath и load_dylib
Load command 12 <-- OLD
cmd LC_LOAD_DYLIB
cmdsize 40
name libtest.dylib (offset 24)
Load command 12 <-- NEW
cmd LC_LOAD_DYLIB
cmdsize 64
name @loader_path/../lib/libtest.dylib (offset 24)
Это команда для выполнения изменения
install_name_tool -change libtest.dylib @loader_path/../lib/libtest.dylib myapp
Также мне нужно было добавить rpath
Load command 14
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
Это команда для выполнения добавления:
install_name_tool -add_rpath "@loader_path/../lib" myapp
Идея
Двоичный пытается найти библиотеку, она знает, где она находится, от install_name_tool -add_rpath "@loader_path/../lib" myapp
. Он загружает библиотеку, а идентификатор библиотеки @rpath/libtest.dylib
, где @rpath
установлен в @loader_path/../lib
в исполняемом двоичном файле, чтобы сделать совпадение.
Ссылка
Cmake
При использовании CMake мы можем автоматизировать процесс со следующим добавлением в файле CMakeLists.txt.
БиблиотекаИдентификатор должен быть добавлен.
# https://cmake.org/pipermail/cmake/2006-October/011530.html
SET_TARGET_PROPERTIES (test
PROPERTIES BUILD_WITH_INSTALL_RPATH 1
INSTALL_NAME_DIR "@rpath"
)
исполнимый
Необходимо указать rpath:
SET(CMAKE_INSTALL_RPATH "@loader_path/../lib/libtest.dylib")