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

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

некоторые из вопросов, которые у меня есть:

  • на концептуальном уровне, каковы основные различия между ними .так и есть .dylib нужна?
  • когда я могу/должен использовать один над другим?
  • компиляция трюки и советы (например, замена для gcc-shared-fPIC, так как это не работает на на OSX)

4 ответов


формат объектного файла Mach-O, используемый Mac OS X для исполняемых файлов и библиотек, различает общие библиотеки и динамически загруженные модули. Использовать otool -hv some_file увидеть типа some_file.

общие библиотеки Mach-O имеют тип файла MH_DYLIB и снести расширение .dylib нужна. Они могут быть связаны с обычными статическими флагами компоновщика, например -lfoo для libfoo.dylib нужна. Они могут быть созданы путем передачи -dynamiclib флаг для компилятора. (-fPIC является значением по умолчанию и не должно быть указано.)

Loadable модули вызваны "пачками" в Mach-O говорят. У них есть тип файла MH_BUNDLE. Они могут нести любое расширение; расширение .bundle рекомендуется Apple, но большинство портированных программ использует .so ради совместимости. Как правило, вы будете использовать пакеты для Плагины которые расширяют приложение; в таких ситуациях пакет будет связываться с двоичный файл приложения для получения доступа к экспортированному API приложения. Они могут быть созданы путем передачи -bundle флаг для компилятора.

как dylibs и пакеты могут быть динамически загружены с помощью dl API-интерфейсы (например,dlopen, dlclose). Невозможно связать пакеты, как если бы они были общими библиотеками. Однако возможно, что пакет связан с реальными общими библиотеками; они будут загружаться автоматически, когда пакет нагруженный.

исторически, различия были более значительны. В Mac OS X 10.0 не было возможности динамически загружать библиотеки. Набор dyld API (например,NSCreateObjectFileImageFromFile, NSLinkModule) были введены с 10.1 для загрузки и выгрузки пакетов, но они не работали для dylibs. А dlopen библиотека совместимости, которая работала с пакетами, была добавлена в 10.3; в 10.4, dlopen был переписан, чтобы быть родной частью dyld и добавлена поддержка загрузки (но не выгрузки) dylibs. Наконец, 10.5 добавлена поддержка использования dlclose С dylibs и устарел dyld APIs.

на системах ELF, таких как Linux, оба используют один и тот же формат файла; любой фрагмент общего кода может использоваться как библиотека и для динамической загрузки.

наконец, имейте в виду, что в Mac OS X,"сверток" можете и обратитесь к каталогам со стандартизированной структурой, содержащей исполняемый код и ресурсы, используемые этим кодом. Есть некоторые концептуальные перекрытие (особенно с "загружаемыми пакетами", такими как плагины, которые обычно содержат исполняемый код в виде пакета Mach-O), но их не следует путать с пакетами Mach-O, рассмотренными выше.

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


файл .таким образом, это не расширение файла UNIX для общей библиотеки.

Это просто случается, чтобы быть общим.

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

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


разницу между .dylib and .так что на mac os x, как они компилируются. Для .поэтому файлы, которые вы используете-shared и for .dylib вы используете-dynamiclib. Оба .так и .dylib взаимозаменяемы как файлы динамической библиотеки и имеют тип DYLIB или BUNDLE. Heres считывание для разных файлов, показывающих это.

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

причина, по которой они эквивалентны в Mac OS X, заключается в обратной совместимости с другими программами ОС UNIX, которые компилируются .так файл тип.

примечания к компиляции: компилируете ли вы .так файл или А.файл dylib необходимо вставить правильный путь в динамическую библиотеку на этапе связывания. Вы делаете это, добавляя-install_name и путь к файлу в команду linking. Если вы этого не сделаете, вы столкнетесь с проблемой, описанной в этом посте:Mac динамическая библиотека сумасшествие (может быть только Fortran).


просто замечание, которое я только что сделал при создании наивного кода на OSX с cmake:

cmake ... - DBUILD_SHARED_LIBS=ВЫКЛ ...

создает .Итак, файлы

пока

cmake ... - DBUILD_SHARED_LIBS=ВКЛ ...

создает .dynlib файлов.

возможно, это кому-то поможет.