Одной из особенностей 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 - это значение по умолчанию.