MacOSX: как собрать зависимости в локальный пакет?

Я создаю приложение плагина (dylib), которое зависит от нескольких других библиотек. Эти другие библиотеки установлены в моей системе, но не гарантируется, что они будут установлены в любой пользовательской системе. Поэтому мне нужно найти способ связывания зависимостей вместе с моим приложением.

Я обнаружил, что я могу использовать otool для перечисления или изменения путей к другим dylib. Это позволит создать папку, которая связывает мое приложение плагина и все необходимые зависимости.

Однако выполнение этого вручную кажется долговременной и немой задачей. Существуют ли утилит для автоматизации?

Или, может быть, я делаю это неправильно, и для этой проблемы есть лучший и более очевидный подход?

Изменить Я создал script, который автоматизирует большинство задач.

Ответы

Ответ 1

Используйте относительные пути в вашем 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 указывает, что "для этого инструмента работать, когда имена установки или rpaths больше, двоичный должен быть построен с параметром ld (1) -headerpad_max_install_names.", поэтому обязательно добавляйте параметр командной строки -headerpad_max_install_names при создании вашей библиотеки.

@loader_path относится к двоичному файлу, используемому для загрузки dylib, в этом случае ваш libmyfoo.dylib. Используйте @executable_path, если вы хотите найти библиотеки относительно исполняемого файла, которые начали последовательность загрузки библиотеки.

Ответ 3

Macdylibbundler - это удобный инструмент, который выполняет именно то, что требуется. Это, безусловно, спасло мою жизнь при распространении двоичных файлов для OSX.