Вопрос, который вы связали, ссылается на функциональность «Связать двоичный файл с библиотеками», которая несколько отличается от встроенного двоичного файла.
«Link Binary With Libraries» означает то, что вы ожидаете от связывания: независимо от того, является ли двоичный файл статической библиотекой, динамической библиотекой или структурой, он будет связан с вашим объектным кодом во время компоновки после компиляции.
Когда вы думаете о связывании со статической библиотекой, то, что происходит, довольно ясно: компоновщик копирует код из библиотеки (например,libFoo.a
) в ваш выходной двоичный файл. Ваш выходной файл увеличивается в размере, но не требует разрешения каких-либо внешних зависимостей во время выполнения. Все, что нужно для запуска вашей программы (относительно статической библиотеки), присутствует после ее сборки.
С динамической библиотекой (.dylib, или системным фреймворком) ожидается, что библиотека, с которой вы связываетесь, будет присутствовать где-то на пути загрузчика динамической библиотеки системы при запуске вашей программы. Таким образом, вам не нужно копировать все сторонние внешние библиотеки в ваш двоичный файл, и все различные программы на компьютере, которые также ссылаются на эту библиотеку, смогут найти его, что экономит минимальное дисковое пространство, но также потенциально пространство памяти, в зависимости от того, как и где система кэширует библиотеки.
Фреймворк очень похож на динамическую библиотеку, но может содержать ресурсы в своей структуре каталогов (изображения, аудио, другие фреймворки и т. Д.). В этом случае простая статическая библиотека или файл .dylib не обрежет его, поэтому вам, возможно, придется ссылаться на фреймворк, чтобы он мог найти то, что ему нужно для правильной работы.
Когда вы ссылаетесь на сторонний фреймворк (скажем, что-то, что вы скачали с github и создали сами), он может отсутствовать в системе, на которой вы собираетесь работать. В этом случае вы не только создадите ссылку на фреймворк, но и внедрите его в свой пакет приложений, используя фазу «Копировать фреймворки». Когда ваша программа запускается, компоновщик времени выполнения (он же распознаватель) будет искать внутри вашего пакета в дополнение к пути системного загрузчика, находить встроенную платформу и связывать ее, чтобы ваше приложение получило код, необходимый для запуска.
Наконец, то, что по сути является «встроенным двоичным файлом», - это исполняемый файл, который вы оба встраиваете в свой пакет приложений на этапе копирования файлов, и который вы выполняете сами, возможно, с помощью вызова popen()
или подобного. Встроенный двоичный файл может вызываться вашей программой, но он не связан с ним. Это полностью внешняя сущность (например, программы в /bin
каталоге).
На практике, для системных библиотек и фреймворков вы будете ссылаться на них, и это все, что вам нужно сделать.
Если вам нужно связать созданную вами библиотеку, которая не нуждается во встроенных ресурсах (т. Е. Не требуется каркас для существования), тогда вы можете просто ссылаться на статическую библиотеку. Если вы обнаружите, что в вашей программе есть несколько модулей, которые хотят использовать один и тот же код библиотеки, то преобразование его в каркас или динамическую библиотеку и связывание с ним могут сэкономить место и могут оказаться удобными (особенно, если использование памяти является проблемой).
Наконец, фреймворки могут включать не только ресурсы, но и файлы заголовков и / или лицензий. Использование инфраструктуры для передачи этих файлов на самом деле является удобным механизмом распространения, поэтому часто вы можете захотеть включить инфраструктуру только для того, чтобы эти вещи могли помечаться вместе с вашим двоичным файлом (то есть требования лицензии могут сделать это обязательным).
--- РЕДАКТИРОВАТЬ ---
Адам Джонс опубликовал следующий вопрос в качестве комментария:
Это отличный ответ. Однако есть кое-что, с чем я все еще немного запутался. Что значит выполнить двоичный файл самостоятельно? Вы имеете в виду просто использование кода встроенного фреймворка? Я знаю, что вы упомянули popen (), но вы говорите, что мое приложение вызывает popen ()? Я действительно не знаю, что это значит.
Я говорю, что встроенный двоичный файл - это просто еще один файл ресурсов в вашем комплекте, например аудиофайл или изображение, хотя этот файл является исполняемым инструментом командной строки. popen()
Функция ( man popen
от вашего терминала , чтобы узнать больше об этом) позволяет выполнять произвольные программы из другой запущенной программы. system()
Функция является еще одним способом. Есть и другие, и я приведу здесь исторический пример, который может сделать понимание использования встроенного двоичного файла немного более ясным:
Как вы, вероятно, знаете, при запуске приложения в Mac OS X оно запускается с идентификатором текущего пользователя. В большинстве распространенных установок это пользователь по умолчанию «пользователь на рабочем столе» admin
, которому назначается идентификатор пользователя 501
.
В операционных системах на основе Unix только root
пользователь (идентификатор пользователя 0
) имеет полный доступ ко всей файловой системе. Иногда случается, что программа установки, запущенная пользователем рабочего стола, должна установить файлы в привилегированном каталоге (например, в драйверах). В этом случае прикладная программа должна передать свои привилегии root
пользователю, чтобы она могла писать в эти ограниченные каталоги.
Чтобы облегчить это в операционных системах через OS X 10.7, Apple предоставила в своем API-интерфейсе служб авторизации функцию AuthorizationExecuteWithPrivileges () (сейчас это устарело, но все еще является полезным примером).
AuthorizationExecuteWithPrivileges()
принял в качестве аргумента путь к инструменту командной строки для выполнения как root
. Инструмент командной строки представлял собой исполняемый сценарий оболочки или скомпилированный двоичный файл, который вы написали для запуска логики установки. Этот инструмент был установлен внутри вашего пакета приложений, как и любой другой файл ресурсов.
При вызове ОС выдает диалоговое окно авторизации с запросом пароля пользователя (вы видели это раньше!) И при входе запускает программу root
от имени вашего приложения. Этот процесс похож на простое выполнение программы с popen()
самим собой, хотя сам по popen()
себе он не дает вам преимущества повышения привилегий.