В чем смысл файлов dylib? - PullRequest
7 голосов
/ 17 ноября 2011

Мой компилятор C ++ создает файлы "dylib", которые содержат динамические библиотеки.В чем разница между файлами .dylib и .so?

А в чем разница между файлами в формате Mach-O и файлами в формате ELF?Мне нужно создавать файлы для последующего использования под iOS (только статические библиотеки / Mach-O) и Android (ELF).

Спасибо!

1 Ответ

5 голосов
/ 18 ноября 2011

Я обнаружил, что:

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

Общие библиотеки Mach-O имеют тип файла MH_DYLIB и имеют расширение .dylib.С ними можно связать обычные статические флаги компоновщика, например, -lfoo для libfoo.dylib.Однако их нельзя загрузить как модуль.(Примечание: общие библиотеки могут загружаться динамически через API. Однако этот API отличается от API для пакетов, а семантика делает его бесполезным для эмуляции dlopen (). В частности, общие библиотеки нельзя выгружать.) [Это больше не так - вы можете использовать dlopen () как с dylibs, так и с пачками.Тем не менее, dylibs по-прежнему не могут быть выгружены.]

Загружаемые модули называются "связками" в языке Mach-O.У них есть тип файла MH_BUNDLE.Поскольку ни один из задействованных компонентов не заботится об этом, они могут иметь любое расширение.Apple рекомендует расширение .bundle, но большинство портированных программ использует .so для совместимости.Пакеты могут быть динамически загружены и выгружены через API-интерфейсы dyld, и есть оболочка, эмулирующая dlopen () поверх этого API.[dlopen теперь является предпочтительным API.] Невозможно связать пакеты, как если бы они были общими библиотеками.Однако, возможно, что пакет связан с реальными общими библиотеками;они будут загружены автоматически при загрузке пакета.

Чтобы скомпилировать обычную общую библиотеку в OS X, вы должны использовать -dynamiclib и расширение .dylib.-fPIC - это значение по умолчанию.

...