MacOSX: как собрать зависимости в локальный пакет? - PullRequest
13 голосов
/ 19 января 2010

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

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 29 января 2010

Используйте относительные пути в вашем dylib, используя install_name_tool.Таким образом, вы можете установить их один раз и установить этот каталог в любом месте без необходимости изменять ваши библиотеки во время установки.

Вы должны поместить все ваши зависимости dylib в одну папку, а затем использовать install_name_tool, чтобы установить относительное расположениедругие дилибы, от которых вы зависите.Предположим, что ваша библиотека 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 isотносительно двоичного файла, используемого для загрузки dylib, в данном случае это ваш libmyfoo.dylib.Используйте @executable_path, если вы хотите найти библиотеки, относящиеся к исполняемому файлу, который запустил последовательность загрузки библиотеки.

4 голосов
/ 01 февраля 2010

Чтобы завершить ответ Кристофера, вот несколько ссылок на полезные ресурсы:

3 голосов
/ 08 сентября 2013

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

...