dylib是MacOS上的动态库扩展,但我从来不清楚什么时候不能/不应该使用传统的Unix.so共享对象.

我有一些问题:

  • 在概念层面上,两者的主要区别是什么.等等.dylib?
  • 我什么时候可以/应该使用其中一种?
  • 编译技巧&提示(例如,替换gcc-shared-fPIC,因为这在osx上不起作用)

推荐答案

Mac OS X用于可执行文件和库的Mach-O对象文件格式在shared librariesdynamically loaded modules之间有区别.使用otool -hv some_file查看some_file的文件类型.

Mach-O共享库的文件类型为100,并带有扩展名.迪利布.它们可以通过常用的静态链接器标志进行链接,例如-lfoo代表libfoo.迪利布.可以通过将-dynamiclib标志传递给编译器来创建它们.(-fPIC是默认值,无需指定.)

可加载模块在Mach-O语言中称为"Bundle ".他们的文件类型是100.它们可以携带任何分机;扩展.bundle是苹果公司推荐的,但为了兼容性,大多数移植软件使用.so.通常,您将使用plug-ins的Bundle 包来扩展应用程序;在这种情况下,bundle将与应用程序二进制文件链接,以访问应用程序导出的API.可以通过将-bundle标志传递给编译器来创建它们.

dylib和Bundle 包都可以使用dl个API(例如dlopendlclose)动态加载.不可能链接到包,就好像它们是共享库一样.但是,Bundle 包可能链接到真正的共享库;这些库将在加载Bundle 包时自动加载.

从历史上看,这种差异更为显著.在MacOSX10.0中,无法动态加载库.10.1中引入了一组DYLDAPI(例如NSCreateObjectFileImageFromFileNSLinkModule)来加载和卸载包,但它们不适用于dylib.在10.3中添加了使用包的dlopen兼容库;在10.4中,dlopen被重写为DYLD的本机部分,并添加了对加载(但不是卸载)dylib的支持.最后,10.5添加了对结合使用dlclose和dylib的支持,并弃用了DYLD API.

在像Linux,both use the same file format这样的ELF系统上,任何一段共享代码都可以用作库和动态加载.

最后,请注意,在MacOSX中,"bundle"可以also引用具有标准化 struct 的目录,该目录包含可执行代码和该代码使用的资源.概念上有一些重叠(特别是与插件之类的"可加载Bundle 包",它们通常包含Mach-OBundle 包形式的可执行代码),但不应将它们与上面讨论的Mach-OBundle 包混淆.

其他参考资料:

C++相关问答推荐

AVX-512 BF 16:直接加载bf 16值,而不是从fp 32转换

初始化char数组-用于初始化数组的字符串是否除了存储数组的位置之外单独存储在内存中

如何避免使用相对路径包含在c中

常数函数指针优化

如何正确地索引C中的 struct 指针数组?

在#include中使用C宏变量

为什么复合文字(C99)的返回会生成更多的汇编代码?

将fget()与strcMP()一起使用不是正确的比较

二进制计算器与gmp

在CLANG中调试预处理器宏

Sizeof(&Q;字符串&Q;)的正确输出是什么?

如何在GDB中查看MUSL的源代码

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

问题:C#Define上的初始值设定项元素不是常量

为什么会出现此错误?二进制表达式的操作数无效

变量值不正确的问题

如何解释数组中的*(ptr)和*(ptr+2)?

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

10 个字节对于这个 C 程序返回后跳行的能力有什么意义