dylib文件的含义是什么?
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是默认设置。