【问题标题】:Difference between "dynamically loading a library file" and "specifying .so path in Makefile"?“动态加载库文件”和“在 Makefile 中指定 .so 路径”之间的区别?
【发布时间】:2012-06-20 09:21:27
【问题描述】:

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

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

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

【问题讨论】:

  • 一个是运行时加载,另一个是加载时加载。

标签: c gcc shared-libraries dynamic-loading


【解决方案1】:

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

link

【讨论】:

  • 我应该补充一点,dl_open 和兄弟姐妹是系统相关的。如果我在 Windows 中没有错,那是完全不同的功能。
  • @Fred:Win32 例程LoadLibrary 等效于dlopen,GetProcAddress 等效于dlsym。它们几乎相同。
  • 好的,但代码仍然不可移植。我的意思是,除非您用宏包围代码,以便在正确的环境中编译正确的例程。我只是认为这是一个值得注意的差异。因为与库链接只是将正确的参数传递给编译器/链接器的问题。
【解决方案2】:

如果您在 Makefile 中静态链接 .so 文件,那么除非它存在,否则您将无法构建应用程序。它的优点是在运行时不会出现令人讨厌的意外。

在创建共享对象时,假设你使用gcc,那么-fpic只表示代码可以在运行时重定位,你还需要-shared。我不知道-rdynamic 选项,但编译器不同。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多