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

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

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

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

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

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

13
задан StackedCrooked 3 February 2010 в 07:32
поделиться

2 ответа

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

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

14
ответ дан 1 December 2019 в 22:39
поделиться

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

4
ответ дан 1 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: