Вы не можете напрямую поместить 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.