Формат объектного файла Mach-O, используемый Mac OS X для исполняемых файлов и библиотек, различает общие библиотеки и динамически загружаемые модули . Используйте, otool -hv some_file
чтобы увидеть тип файла some_file
.
MH_DYLIB
Общие библиотеки Mach-O имеют тип файла и имеют расширение .dylib. Они могут быть связаны с обычными статическими флагами компоновщика, например, -lfoo
для libfoo.dylib. Они могут быть созданы путем передачи -dynamiclib
флага компилятору. ( -fPIC
является значением по умолчанию и не должно быть указано.)
Загружаемые модули называются «связками» в Mach-O. У них есть тип файла MH_BUNDLE
. Они могут нести любое расширение; .bundle
Apple рекомендует это расширение , но большинство переносимого программного обеспечения использует его .so
для совместимости. Как правило, вы будете использовать пакеты для плагинов, которые расширяют приложение; в таких ситуациях пакет связывается с двоичным файлом приложения, чтобы получить доступ к экспортированному API приложения. Они могут быть созданы путем передачи -bundle
флага компилятору.
Как библиотеки, так и пакеты могут быть динамически загружены с помощью dl
API (например dlopen
, dlclose
). Невозможно связать пакеты, как если бы они были общими библиотеками. Однако возможно, что пакет связан с реальными общими библиотеками; они будут загружены автоматически при загрузке пакета.
Исторически различия были более значительными. В Mac OS X 10.0 не было возможности динамически загружать библиотеки. Набор API для dyld (например NSCreateObjectFileImageFromFile
, NSLinkModule
) был представлен с 10.1 для загрузки и выгрузки пакетов, но они не работали для dylibs. dlopen
Библиотеки совместимости , которая работала с пучками была добавлена в 10.3; в 10.4 он dlopen
был переписан как родной для dyld и добавил поддержку для загрузки (но не выгрузки) dylibs. Наконец, в 10.5 добавлена поддержка использования dlclose
с dylibs и устаревшие API-интерфейсы dyld.
В системах ELF, таких как Linux, обе используют один и тот же формат файла ; любой фрагмент общего кода может быть использован как библиотека и для динамической загрузки.
Наконец, имейте в виду, что в Mac OS X «пакет» может также ссылаться на каталоги со стандартизированной структурой, которая содержит исполняемый код и ресурсы, используемые этим кодом. Существует некоторое концептуальное совпадение (особенно с «загружаемыми пакетами», такими как плагины, которые обычно содержат исполняемый код в форме пакета Mach-O), но их не следует путать с пакетами Mach-O, описанными выше.
Дополнительные ссылки:
-dynamiclib
это флаг GCC. Это заставляет компилятор перейти-dylib
на ld.Файл .so не является расширением UNIX для общей библиотеки.
Просто так получилось.
Проверьте строку 3b на странице общей библиотеки ArnaudRecipes
В основном .dylib - это расширение файла Mac, используемое для обозначения общей библиотеки.
источник
Разница между .dylib и .so в Mac OS X заключается в том, как они компилируются. Для .so файлов вы используете -shared, а для .dylib вы используете -dynamiclib. И .so, и .dylib взаимозаменяемы как файлы динамических библиотек и имеют тип DYLIB или BUNDLE. Вот показания для разных файлов, показывающих это.
Причина того, что они эквивалентны в Mac OS X, заключается в обратной совместимости с другими программами UNIX OS, которые компилируются в тип файла .so.
Замечания по компиляции: независимо от того, компилируете ли вы файл .so или файл .dylib, вам нужно вставить правильный путь в динамическую библиотеку на этапе компоновки. Это можно сделать, добавив -install_name и путь к файлу к команде связывания. Если вы этого не сделаете, вы столкнетесь с проблемой, описанной в этом посте: Mac-Dynamic Library Craziness (может быть только Fortran) .
источник
./configure
чтобы генерировать.dylib
файлы, а не связывать файлы.so
?./configure --enable-shared
не выполняет эту задачу.Просто замечание, которое я только что сделал при создании простого кода для OSX с помощью cmake:
создает .so файлы
пока
создает файлы .dynlib .
Возможно, это кому-нибудь поможет.
источник