Могу ли я включить dylib-s в мой исполняемый файл? - PullRequest
7 голосов
/ 01 февраля 2012

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

У меня есть исполняемый файл, который я создал изкомандная строка - на OS-X / Lion, если это имеет значение.Я доставил исполняемый файл другу, но он не может запустить его, потому что у него не установлены библиотеки.Он предпочел бы , а не установить библиотеки, поэтому сейчас я пытаюсь создать пакет, который включает в себя оригинальный исполняемый файл плюс все необходимые библиотеки.

Я привык работать в XCode(IDE), и я не очень знаком с инструментами сборки и сборки из командной строки и их параметрами.(Я создал этот инструмент, следуя очень хорошим инструкциям из Интернета.) Следовательно, явные инструкции будут полезны.

Спасибо!

Ответы [ 2 ]

12 голосов
/ 26 апреля 2012

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

Вы можете перестроить каждый dylib как статическую (.a) библиотеку, и в этом случае весь код, необходимый вашему исполняемому файлу, будет скопирован в исполняемый файл, и вам не нужно ничего с ним распространять. Если у вас есть исходный код для библиотек, это обычно очень просто, но, не зная точно, как вы строите вещи, сложно сказать, что нужно изменить.

При статическом связывании следует помнить, что оно влияет на совместную работу разных лицензий. В частности, если какая-либо из используемых вами библиотек лицензирована LGPL, статическое связывание с ними имеет последствия, которых нет у динамического связывания. См. этот вопрос (и ссылки на ответ) для получения более подробной информации, но на самом деле, вы не должны доверять ответам по переполнению стека для юридических консультаций по лицензиям. В любом случае, это, вероятно, не проблема для ОП: «Я хочу построить программу и передать ее моему другу», но для других, читающих этот вопрос позже, это может быть.

Если статическая компоновка невозможна или нежелательна, все, что вам нужно сделать, это упаковать исполняемый файл и dlib-файлы вместе и загрузить их на компьютер вашего друга. Поскольку он, очевидно, не хочет запускать установщик, это означает tar-архив или zip-файл.

Единственная сложность - убедиться, что exe знает, где найти дилибов. Если каждый dylib не находится ни в пути поиска dyld (см. Справочную страницу для dyld для получения дополнительной информации, но он не поможет вам, если вы не хотите ничего устанавливать), либо в том же месте, где он был в то время, когда вы связал его, запуск исполняемого файла завершится с ошибкой «изображение не найдено» от dyld.

К счастью, «точно такое же место» может означать магический путь, например «@ executetable_path / libfoo.dylib», что означает «в том же каталоге, что и myexe», а не абсолютный путь, такой как «/ opt / local / lib / libfoo.dylib "или относительный путь, например" ../../foo/build/Release/libfoo.dylib ". (Обратите внимание, что нормальные относительные пути относятся к текущему рабочему каталогу, а не к каталогу исполняемого файла или пакета).

Вы можете увидеть, где myexe ищет, выполнив это:

otool -L myexe

Все, что не просматривается в @executable_path (кроме содержимого в / lib и / usr / lib, который является частью ОС и не нуждается в распространении), вы можете исправить следующим образом:

install_name_tool -change ../../../mydl/build/Release/libmydl.dylib @executable_path/libmydl.dylib myexe

Теперь вам просто нужно скопировать все эти dylib прямо рядом с myexe, скопировать их и передать другу, и он может просто распаковать его и запустить exe.

0 голосов
/ 07 февраля 2012

В Mac OS X дилибы обычно хранятся в «/ usr / local /». По умолчанию все приложения ищут все необходимые библиотеки в "/usr/local/".

Вариант 1 - разместить dylibs на машинах ваших друзей "/usr/local/".

Вариант 2, поместите библиотеки в тот же каталог, что и ваш исполняемый файл.

Вариант 3. Исправить путь в приложении или в dylib. XCode dylib, ищущий в / usr / lib , будет полезен. Вы можете использовать эту опцию, чтобы упаковать дизельные библиотеки в место по вашему выбору, то есть как внутри, так и снаружи пакета приложения.

...