Mac OS X:Как собрать зависимости в локальный бандл?

StackOverflow https://stackoverflow.com/questions/2092378

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top