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