dylib文件的含义是什么?

17 浏览
0 Comments

dylib文件的含义是什么?

我的C++编译器会生成包含动态库的"dylib"文件。.dylib和.so文件有什么区别呢?Mach-O格式和ELF格式的文件有什么区别呢?我需要为将来在iOS(仅限静态库/Mach-O)和Android(ELF)下使用构建文件。谢谢!

0
0 Comments

dylib文件的含义是什么?这个问题的出现是因为Mach-O系统中共享库和动态可加载模块之间存在严格区分。在ELF系统中,它们是相同的;任何共享代码都可以用作库和动态加载。使用otool -hv some_file命令可以查看some_file文件的文件类型。

Mach-O共享库的文件类型为MH_DYLIB,并且扩展名为.dylib。可以使用通常的静态链接器标志与其进行链接,例如-lfoo用于libfoo.dylib。但是,它们不能作为模块加载。(顺便说一下:共享库可以通过API进行动态加载。然而,该API与bundle的API不同,并且语义使其在dlopen()模拟中无用。尤其是,共享库不能被卸载。)[这不再是真实情况-现在您可以使用dlopen()在dylibs和bundles上。但是,dylibs仍然无法被卸载。]

可加载模块在Mach-O中被称为"bundles"。它们的文件类型为MH_BUNDLE。由于没有相关组件关心它,它们可以带有任何扩展名。Apple建议使用扩展名.bundle,但大多数移植软件使用.so以保持兼容性。Bundles可以通过dyld API进行动态加载和卸载,并且有一个在该API之上仿真dlopen()的包装器。[dlopen现在是首选的API。]无法像链接共享库那样链接bundles。但是,一个bundle可能会链接到真正的共享库;当加载bundle时,这些库将自动加载。

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

来源:stackoverflow.com/a/2339910

0