【发布时间】:2011-11-16 21:13:28
【问题描述】:
我的 C++ 编译器创建包含动态库的“dylib”文件。 .dylib 和 .so 文件有什么区别?
Mach-O 格式的文件和 ELF 格式的文件有什么区别?我必须在 iOS(仅限静态库/Mach-O)和 Android(ELF)下构建文件以供以后使用。
谢谢!
【问题讨论】:
标签: elf mach-o dynamic-library
我的 C++ 编译器创建包含动态库的“dylib”文件。 .dylib 和 .so 文件有什么区别?
Mach-O 格式的文件和 ELF 格式的文件有什么区别?我必须在 iOS(仅限静态库/Mach-O)和 Android(ELF)下构建文件以供以后使用。
谢谢!
【问题讨论】:
标签: elf mach-o dynamic-library
我发现:
一个令很多人大吃一惊的 Mach-O 功能是严格的 共享库和动态可加载模块之间的区别。 在 ELF 系统上两者是相同的;任何一段共享代码都可以使用 作为库和动态加载。使用 otool -hv some_file 查看 some_file 的文件类型。
Mach-O 共享库的文件类型为 MH_DYLIB,并带有 扩展名 .dylib。它们可以与通常的静态链接 链接器标志,例如-lfoo 用于 libfoo.dylib。然而,他们不能 作为模块加载。 (旁注:可以加载共享库 通过 API 动态地。但是,该 API 不同于 捆绑包的 API 和语义使其对 dlopen() 无用 仿真。最值得注意的是,无法卸载共享库。)[这个 不再正确——您可以将 dlopen() 与 dylibs 和 bundles 一起使用。 但是,dylibs 仍然无法卸载。]
可加载模块在 Mach-O 语言中称为“捆绑包”。他们有 文件类型 MH_BUNDLE。由于没有涉及的组件关心它,他们 可以进行任何扩展。扩展名 .bundle 由 Apple,但大多数移植软件使用 .so 是为了 兼容性。 Bundles可以通过dyld动态加载和卸载 API,并且有一个包装器在其之上模拟 dlopen() API。 [dlopen 现在是首选 API。] 无法链接 就像它们是共享库一样反对捆绑。然而,它是 捆绑包可能链接到真正的共享库;那些 加载包时会自动加载。
要在 OS X 上编译一个普通的共享库,你应该使用 -dynamiclib 和扩展名 .dylib。 -fPIC 是默认值。
【讨论】: