C 区别于;动态加载库文件";及;是否在Makefile“中指定.so路径?”;?

C 区别于;动态加载库文件";及;是否在Makefile“中指定.so路径?”;?,c,gcc,shared-libraries,dynamic-loading,C,Gcc,Shared Libraries,Dynamic Loading,我最近遇到一段代码,它使用dl_open()加载.so文件,并使用dlsym()等。我知道dl_open()将加载动态库文件。动态加载库文件和在Makefile中指定.so路径有什么区别 另一个问题是,如果要动态加载库文件,是否需要使用-rdynamic选项编译它 这两个文件都是用-fPIC标志编译的吗?动态加载库文件是实现软件插件的常用方法。 与在Makefile或静态链接中指定.so路径不同,动态链接将允许计算机程序在没有这些库的情况下启动,发现可用库,并可能获得其他功能 如果在Makefi

我最近遇到一段代码,它使用dl_open()加载.so文件,并使用dlsym()等。我知道dl_open()将加载动态库文件。动态加载库文件和在Makefile中指定.so路径有什么区别

另一个问题是,如果要动态加载库文件,是否需要使用-rdynamic选项编译它


这两个文件都是用
-fPIC
标志编译的吗?

动态加载库文件是实现软件插件的常用方法。 与在Makefile或静态链接中指定.so路径不同,动态链接将允许计算机程序在没有这些库的情况下启动,发现可用库,并可能获得其他功能


如果在Makefile中静态链接.so文件,则除非该文件存在,否则无法构建应用程序。它的优点是在运行时没有令人讨厌的意外

创建共享对象时,假设您使用的是
gcc
,那么
-fpic
仅意味着代码可以在运行时重新定位,您还需要
-shared
。我不知道
-rdynamic
选项,但编译器不同


在运行时加载模块允许模块加载是可选的。例如,假设您有一个包含300个模块的大型应用程序,每个模块代表不同的功能。当用户可能只使用其中的10%时,映射所有300个是否有意义?(代码是按需加载的)它还可以用于在运行时加载来自不同库的版本,从而提供灵活性。缺点是,您可能会加载不兼容的版本。

我应该补充一点,dl_open和同级依赖于系统。如果我在Windows中没有错的话,这些函数是完全不同的。@Fred:Win32例程
LoadLibrary
相当于
dlopen
,而
GetProcAddress
相当于
dlsym
。它们几乎是一样的。好吧,但代码仍然是不可移植的。我的意思是,除非你用宏来包围代码,这样你就可以在正确的环境中编译正确的例程。我只是觉得这是一个值得注意的区别。因为与库的链接只是将正确的参数传递给编译器/链接器的问题。一个是运行时加载,另一个是加载时加载。