Я создаю сменное приложение (dylib), который зависит от нескольких других библиотек. Эти другие библиотеки установлены в моей системе, но, как гарантируют, не будут установлены в системе никакого пользователя. Таким образом, я должен найти, что путь связывает зависимости наряду с моим приложением.
Я нашел, что могу использовать otool
перечислить или изменить пути к другому dylibs. Это позволило бы создавать папку, которая связывает мое сменное приложение и все необходимые зависимости.
Однако выполнение этого вручную походит на трудоемкую и немую задачу. Действительно ли там утилиты доступны для автоматизации его?
Или возможно я делаю его неправильно и существует лучший и более очевидный подход для этой проблемы?
Редактирование я создал сценарий, который автоматизирует больше всего задачу.
Используйте относительные пути в dylib, используя инструмент install_name_tool. Таким образом, вы можете установить их один раз и установить этот каталог куда угодно без необходимости изменять ваши библиотеки во время установки.
Вы должны поместить все ваши зависимости от dylib в одну папку, а затем использовать инструмент install_name_tool для установки относительного расположения других зависимых от вас dylib. Предположим, что ваша библиотека libmyfoo.dylib зависит от libbar.dylib:
install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib
Таким образом, ваша библиотека всегда будет искать libbar.dylib в том же каталоге, где находится libmyfoo.dylib.
Вам также может понадобиться запустить инструмент install_name_tool на некоторых других dylib, если они зависят друг от друга.
Остерегайтесь, в документации к install_name_tool указано, что "Для того, чтобы эта утилита работала, когда установочные имена или rpath больше, двоичный файл должен быть собран с помощью опции ld(1) -headerpad_max_install_names.", поэтому не забудьте включить опцию командной строки -headerpad_max_install_names
при сборке вашей библиотеки.
@@loader_path
относится к двоичному файлу, используемому для загрузки dylib, в данном случае к вашему libmyfoo.dylib. Используйте @executable_path
, если хотите найти библиотеки относительно исполняемого файла, который запустил последовательность загрузки библиотеки.
Чтобы завершить ответ Кристофера, вот несколько ссылок на полезные ресурсы: