我最近遇到了一个代码,它使用 dl_open() 加载 .so 文件并使用 dlsym() 等。我知道 dl_open() 这将加载动态库文件。动态加载库文件和在 Makefile 中指定 .so 路径有什么区别?
另一个问题是,如果我想动态加载一个库文件,我需要用 -rdynamic 选项编译它吗?
这两个不是用-fPIC
标志编译的吗?
我最近遇到了一个代码,它使用 dl_open() 加载 .so 文件并使用 dlsym() 等。我知道 dl_open() 这将加载动态库文件。动态加载库文件和在 Makefile 中指定 .so 路径有什么区别?
另一个问题是,如果我想动态加载一个库文件,我需要用 -rdynamic 选项编译它吗?
这两个不是用-fPIC
标志编译的吗?
动态加载库文件经常用于实现软件插件。与在 Makefile 或静态链接中指定 .so 路径不同,动态链接将允许计算机程序在没有这些库的情况下启动,发现可用的库,并可能获得额外的功能。
如果您在 Makefile 中静态链接 .so 文件,那么除非它存在,否则您将无法构建应用程序。它的优点是在运行时不会出现令人讨厌的意外。
创建共享对象时,假设您正在使用gcc
,那么-fpic
仅意味着代码可以在运行时重新定位,您也需要-shared
。我不知道-rdynamic
选项,但编译器不同。
在运行时加载模块允许模块加载是可选的。例如,假设您有一个包含 300 个模块的大型应用程序,每个模块代表不同的功能。当用户可能只使用其中的 10% 时,映射所有 300 个是否有意义?(无论如何,代码都是按需加载的)它也可以用于在运行时从不同的库中加载版本,从而提供灵活性。缺点是您最终可能会加载不兼容的版本。