dlopen 与标准动态链接的用例是什么?

Phy*_*ade 9 c shared-libraries dynamic-linking

根据文档,dlopendlopen一起dlsym用于加载库,并获取指向符号的指针。

但这已经是动态加载器/链接器所做的。此外,这两种方法都基于ld.so

使用时实际上似乎有两个不同之处dlopen

  1. 该库可以有条件地加载。
  2. 编译器不知道我们正在使用的符号(类型、原型...),因此不会检查潜在的错误。顺便说一下,这是实现自省的一种方式。

但是,它似乎并没有激发使用dlopen超标准加载,除了边际示例:

  1. 就内存占用优化而言,当共享库已被另一个程序使用时,条件加载并不是很有趣:加载已使用的库不会增加内存占用。
  2. 避免编译器监督是不安全的,也是编写错误的好方法......我们也错过了潜在的编译器优化。

那么,是否有其他用途dlopen比标准动态链接/加载更受欢迎?

yug*_*ugr 5

那么,与标准动态链接/加载相比,dlopen 是否还有其他用途?

使用的典型用例dlopen

  • 插件
  • 为当前 CPU 选择最佳实现(英特尔数学库执行此操作)
  • 选择不同供应商的 API 实现(GLEW 和其他 OpenGL 包装器执行此操作)
  • 如果不太可能使用共享库,则延迟加载它(这会加快启动速度,因为库构造函数不会运行 + 运行时链接器要做的工作会少一些)

避免编译器监督是不安全的,也是编写错误的好方法......我们也错过了潜在的编译器优化。

确实如此,但您可以通过提供一个围绕延迟加载共享库的小型包装库来实现两全其美。在 Windows 上,这是通过标准工具(谷歌搜索“DLL 导入库”)完成的,在 Linux 上,您可以手动完成或使用Implib.so