8

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

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

谢谢!

4

1 回答 1

5

我找到:

令许多人感到惊讶的 Mach-O 特性之一是共享库和动态可加载模块之间的严格区别。在 ELF 系统上两者是相同的;任何一段共享代码都可以用作库和动态加载。使用 otool -hv some_file 查看 some_file 的文件类型。

Mach-O 共享库的文件类型为 MH_DYLIB,扩展名为 .dylib。它们可以使用通常的静态链接器标志进行链接,例如 -lfoo 用于 libfoo.dylib。但是,它们不能作为模块加载。(旁注:共享库可以通过 API 动态加载。但是,该 API 与用于捆绑包的 API 不同,并且语义使其对 dlopen() 仿真无用。最值得注意的是,无法卸载共享库。) [这不再是真的——你可以将 dlopen() 与 dylib 和 bundle 一起使用。但是,dylibs 仍然无法卸载。]

可加载模块在 Mach-O 语言中称为“捆绑包”。它们的文件类型为 MH_BUNDLE。由于没有涉及的组件关心它,因此它们可以进行任何扩展。扩展名 .bundle 是 Apple 推荐的,但大多数移植软件出于兼容性考虑使用 .so。Bundles 可以通过 dyld API 动态加载和卸载,并且在该 API 之上有一个模拟 dlopen() 的包装器。[dlopen 现在是首选 API。] 无法像共享库一样链接捆绑包。但是,捆绑包可能链接到真正的共享库。这些将在加载捆绑包时自动加载。

要在 OS X 上编译普通的共享库,您应该使用 -dynamiclib 和扩展名 .dylib。-fPIC 是默认值。

于 2011-11-18T08:37:58.947 回答