2012-02-01 3 views
6

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

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

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

Спасибо!

+0

Не могли бы вы принять ответ Абарнер? Это поможет другим людям найти его. Это было очень полезно для меня. – Yitz

+0

Готово. Извините за задержку. – Olie

ответ

10

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

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

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

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

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

К счастью, «точное место» может означать магический путь, например «@ executable_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 

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

+0

Одна вещь, которую я должен был упомянуть, но не сделал: Если вы хотите использовать статические библиотеки, вам нужно проверить совместимость лицензий. Я отредактирую ответ. – abarnert

+1

Spot on - с точки зрения install_name_tool, однако вам не хватает того факта, что вам также нужно имя исполняемого файла в конце строки. – Damian

+0

@Damian: Хороший улов, спасибо. Отредактировал ответ. – abarnert

-1

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

Вариант 1 состоит в том, чтобы разместить dylib в машинах ваших друзей «/ usr/local /».

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

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

+2

Приложения не ищут dylib в/usr/local. Вероятно, вы имели в виду/usr/local/lib, но это только частично точно. Управляющая страница на dyld объясняет, где они выглядят (см., В частности, DYLD_LIBRARY_PATH и DYLD_FALLBACK_LIBRARY_PATH). – abarnert

Смежные вопросы