根据医生的说法,dlopen https://linux.die.net/man/3/dlopen与一起使用dlsym
加载库并获取指向符号的指针。
但这已经是动态加载器/链接器所做的事情了。
而且,这两种方法都是基于ld.so https://linux.die.net/man/8/ld.so.
使用时实际上似乎有两个区别dlopen
:
- 可以有条件地加载该库。
- 编译器不知道我们正在使用的符号(类型、原型......),因此不会检查潜在的错误。顺便说一句,这是实现内省的一种方式。
但是,它似乎并没有激发使用dlopen
超过标准负载,除了边际示例:
- 当共享库已被另一个程序使用时,就内存占用优化而言,条件加载并不是很有趣:加载已使用的库并不会增加内存占用。
- 避免编译器监督是不安全的,也是编写错误的好方法......我们还缺少潜在的编译器优化。
那么,还有其他用途吗?dlopen
优于标准动态链接/加载?
那么,还有其他用途,dlopen 比标准动态链接/加载更受青睐吗?
使用的典型用例dlopen
are
- plugins
- 选择当前 CPU 的最佳实现(英特尔数学库执行此操作)
- 选择不同供应商的 API 实现(GLEW 和其他 OpenGL 包装器执行此操作)
- 如果不太可能使用共享库,则延迟加载它(这将加快启动速度,因为库构造函数不会运行+运行时链接器要做的工作会稍微少一些)
避免编译器监督是不安全的,也是编写错误的好方法......
我们还缺少潜在的编译器优化。
确实如此,但是通过提供一个围绕延迟加载共享库的小型包装库,您可以两全其美。在 Windows 上,这是通过标准工具完成的(谷歌搜索“DLL 导入库”),在 Linux 上,您可以手动完成或使用实现库 https://github.com/yugr/Implib.so.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)