dylib文件的含义是什么?

10

我的C++编译器会生成包含动态库的"dylib"文件。.dylib和.so文件有什么区别?

Mach-O格式文件与ELF格式文件之间有什么区别?我需要构建供iOS(仅静态库/Mach-O)和Android(ELF)后续使用的文件。

谢谢!

1个回答

7
我发现:
很多人都会被一项Mach-O的特性所惊讶,即严格区分共享库和可动态加载模块。在ELF系统中,两者是相同的;任何共享代码片段都可以用作库和动态加载。使用otool -hv some_file命令查看some_file的文件类型。
Mach-O共享库的文件类型为MH_DYLIB,扩展名为.dylib。可以使用通常的静态链接器标志(例如-lfoo表示libfoo.dylib)对其进行链接。但是,它们不能作为模块加载。(附注:共享库可以通过API进行动态加载。然而,该API与束的API不同,并且语义使其无法用于dlopen()仿真。最显着的是,共享库无法卸载。)[这已经不再是真的了 - 你现在可以在dylibs和bundles上使用dlopen()。但是,仍旧不能卸载dylibs。]
在Mach-O中,可加载的模块被称为"bundles"。它们的文件类型为MH_BUNDLE。由于涉及到的任何组件都不关心它,因此可以携带任何扩展名。Apple建议使用扩展名.bundle,但大多数移植软件使用.so以确保兼容性。可以通过dyld API动态加载和卸载bundles,还有一个包装器在该API之上模拟dlopen()。[dlopen现在是首选的API。]不可能像链接共享库一样链接bundle。但是,一个bundle可以链接真正的共享库;当加载bundle时,这些库将自动加载。
要在OS X上编译普通的共享库,应使用-dynamiclib和扩展名.dylib。-fPIC是默认设置。

你能添加源代码吗?https://dev59.com/NHE95IYBdhLWcg3wXsyR#2339910 - Scott Staniewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接