Каковы различия между.так и.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, рассмотренными выше.
Дополнительные ссылки:
- Руководство По Портированию Fink, основа для этого ответа (хотя и довольно устаревшая, так как она была написана для Mac OS X 10.3).
- ld (1) и dlopen (3)
- Динамические Темы Программирования Библиотеки
- Темы Программирования 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 файлов.
возможно, это кому-то поможет.