2011-11-16 71 views
6

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

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

感谢名单!

回答

4

我发现:

一,通过令人吃惊的Mach-O的功能是共享库和可加载模块的严格区分 。 在ELF系统上都是一样的;任何一段共享代码都可以作为库和动态加载使用 。使用otool -hv some_file来查看 some_file的文件类型。

Mach-O共享库的文件类型为MH_DYLIB,并且带有 扩展名.dylib。它们可以与通常的静态链接器标记例如 链接。 -lfoo用于libfoo.dylib。但是,他们不能将 作为模块加载。 (注意:共享库可以通过API动态地加载 ,但是这个API与 API不同,它的语义使得它对dlopen() 模拟没有用处,尤其是共享库不能被卸载。)[这个 不再是真的,你可以在dylib和bundle中使用dlopen()。 但是,dylib仍然不能卸载。]

可加载模块在Mach-O中被称为“捆绑”。他们有 文件类型MH_BUNDLE。由于不涉及任何组件,因此它们可以携带任何扩展名。推荐使用 Apple的扩展.bundle,但大多数移植软件都使用.so以便兼容 。 Bundles可以通过API动态加载和卸载,并且在该API的顶部有一个模拟dlopen()的包装器。 [dlopen现在是首选的API。]不可能将 与捆绑链接关联,就好像它们是共享库一样。然而,它可能是 捆绑与真正的共享库链接;这些 将在加载包时自动加载。

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

相关问题