我的C ++编译器创建包含动态库的“dylib”文件。什么是.dylib和.so文件之间的区别?
Mach-O格式的文件和ELF格式的文件有什么区别?我必须构建文件供以后在iOS(仅静态库/ Mach-O)和Android(ELF)下使用。
感谢名单!
答案 0 :(得分:5)
我发现:
一个令人惊讶的一个Mach-O功能是严格的 共享库和动态可加载模块之间的区别。 在ELF系统上两者都是相同的;可以使用任何共享代码 作为库和动态加载。使用otool -hv some_file来查看 some_file的文件类型。
Mach-O共享库的文件类型为MH_DYLIB并带有 扩展名.dylib。它们可以与通常的静态链接 链接器标志,例如-lfoo for libfoo.dylib。但是,他们不可能 作为模块加载。 (旁注:可以加载共享库 动态地通过API。但是,该API不同于 捆绑包的API和语义使得dlopen()无用 仿真。最值得注意的是,共享库无法卸载。)[这个 不再是真的 - 你可以将dlopen()与dylib和bundle一起使用。 但是,仍然无法卸载dylib。]
可装载模块在Mach-O中被称为“捆绑”。他们有 文件类型MH_BUNDLE。由于没有涉及的组件关心它,他们 可以进行任何延期。推荐使用扩展名.bundle Apple,但大多数移植软件都使用.so 兼容性。捆绑包可以通过dyld动态加载和卸载 API,并且有一个模拟dlopen()的包装器 API。 [dlopen现在是首选API。]无法链接 反对bundle,好像它们是共享库一样。但是,确实如此 捆绑可能与真正的共享库相关联;那些 将在加载包时自动加载。
要在OS X上编译普通的共享库,您应该使用-dynamiclib 和扩展名.dylib。 -fPIC是默认值。