2010-01-19 3 views
13

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

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

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

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

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

ответ

14

Используйте относительные пути в своем 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, если вы хотите найти библиотеки относительно исполняемого файла, которые начали последовательность загрузки библиотеки.

+0

Помните, что это автоматический принятый ответ на раздачу. По-видимому, это фактически не разрешало проблему вопросчика. –

3

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