Каковы различия между .so и .dylib на osx?

.dylib является динамическим расширением библиотеки на OSX, но мне никогда не было ясно, когда я не могу / не должен использовать традиционный Unix .so общий объект.

Некоторые вопросы я имею:

  • На концептуальном уровне, каковы основные отличия между .so и .dylib?
  • Когда могут/должны, я использую один по другому?
  • Приемы компиляции и подсказки (Например, замена для gcc - совместно использовала-fPIC, так как это не работает над osx),
195
задан Trent Davies 25 February 2010 в 19:31
поделиться

2 ответа

Формат объектного файла 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.

Дополнительные ссылки:

185
ответ дан 23 November 2019 в 05:22
поделиться

Файл .so не является расширением файла UNIX для разделяемой библиотеки.

Просто оно часто встречается.

Проверьте строку 3b на странице ArnaudRecipes sharedlib

В основном .dylib - это расширение файла mac, используемое для обозначения разделяемой библиотеки.

19
ответ дан 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: