【问题标题】:What's the meaning of dylib files?dylib 文件的含义是什么?
【发布时间】:2011-11-16 21:13:28
【问题描述】:

我的 C++ 编译器创建包含动态库的“dylib”文件。 .dylib 和 .so 文件有什么区别?

Mach-O 格式的文件和 ELF 格式的文件有什么区别?我必须在 iOS(仅限静态库/Mach-O)和 Android(ELF)下构建文件以供以后使用。

谢谢!

【问题讨论】:

    标签: elf mach-o dynamic-library


    【解决方案1】:

    我发现:

    一个令很多人大吃一惊的 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 是默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多