Mac OS X:Как собрать зависимости в локальный бандл?
-
21-09-2019 - |
Вопрос
Я создаю приложение-плагин (dylib), которое зависит от нескольких других библиотек.Эти другие библиотеки установлены в моей системе, но их установка в системе любого пользователя не гарантируется.Поэтому мне нужно найти способ объединить зависимости вместе с моим приложением.
Я обнаружил, что могу использовать otool
чтобы перечислить или изменить пути к другим библиотекам dylib.Это позволит создать папку, в которую будет объединено мое приложение-плагин и все необходимые зависимости.
Однако делать это вручную кажется трудоемкой и глупой задачей.Существуют ли утилиты для автоматизации этого процесса?
Или, возможно, я делаю это неправильно, и есть лучший и более очевидный подход к этой проблеме?
РедактироватьЯ создал сценарий это автоматизирует большую часть задачи.
Решение
Используйте относительные пути в вашем 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 для некоторых других dylibs, если они зависят друг от друга.
Осторожно, документация для имя_установки_инструмент указывает, что «чтобы этот инструмент работал, когда имена установки или пути rpath больше, двоичный файл должен быть собран с параметром ld(1) -headerpad_max_install_names.», поэтому обязательно включите параметр -headerpad_max_install_names
параметр командной строки при создании библиотеки.
@loader_path
относится к двоичному файлу, используемому для загрузки dylib, в данном случае к вашему libmyfoo.dylib.Использовать @executable_path
если вы хотите найти библиотеки относительно исполняемого файла, который начал последовательность загрузки библиотеки.
Другие советы
Чтобы завершить ответ Кристофера, вот несколько ссылок на полезные ресурсы:
Макдилиббундлер это удобный небольшой инструмент, который делает именно то, что требуется.Это определенно спасло мне жизнь при распространении двоичных файлов для OSX.