Mar*_*ser 7 mach-o elf dynamic-library
我的C++编译器创建包含动态库的"dylib"文件.什么是.dylib和.so文件之间的区别?
Mach-O格式的文件和ELF格式的文件有什么区别?我必须构建文件供以后在iOS(仅静态库/ Mach-O)和Android(ELF)下使用.
感谢名单!
我找到:
令许多人惊讶的Mach-O功能是共享库和可动态加载的模块之间的严格区别。在ELF系统上,两者相同。任何共享代码段都可以用作库并用于动态加载。使用otool -hv some_file查看some_file的文件类型。
Mach-O共享库的文件类型为MH_DYLIB,并带有扩展名.dylib。可以使用通常的静态链接器标志来链接它们,例如,-lfoo表示libfoo.dylib。但是,它们不能作为模块加载。(注意:共享库可以通过API动态加载。但是,该API与捆绑软件的API不同,并且语义使得它对于dlopen()仿真无用。最值得注意的是,无法卸载共享库。)[这不再是正确的-您可以将dlopen()与dylib和bundle一起使用。但是,dylib仍然无法卸载。]
可加载模块在Mach-O语言中称为“捆绑”。它们的文件类型为MH_BUNDLE。由于没有涉及的组件在乎它,因此它们可以进行任何扩展。Apple建议使用扩展名.bundle,但是出于兼容性考虑,大多数移植的软件都使用.so。捆绑包可以通过dyld API进行动态加载和卸载,并且在该API之上有一个可模拟dlopen()的包装器。[dlopen现在是首选的API。]无法像捆绑包一样共享捆绑包。但是,捆绑包可能会链接到实际的共享库。捆绑包加载后,这些将自动加载。
要在OS X上编译普通共享库,应使用-dynamiclib和扩展名.dylib。-fPIC是默认值。