【问题标题】:Dynamic linking (using dlopen) and header inclusion in CC 中的动态链接(使用 dlopen)和标头包含
【发布时间】:2014-03-21 16:11:30
【问题描述】:

我的程序可以使用某个库(我们称之为 foo),而这个库是非免费的。所以我不想在编译时和运行时都让它成为一个依赖项。该库仅提供了不错的额外功能,因此该程序可以在没有 foo 的情况下运行。所以我打算这样做:

  • 让 configure 在编译时查找 foo,如果不存在,则构建 该程序没有额外的功能。这部分很简单。
  • 如果 foo 存在则 #include foo.h,但不要链接到共享 库(因为程序必须能够在没有 foo 的情况下运行 present),而是使用 dlopen(foo.so) 和 dlsym()。

那么,如果我仍然要使用动态链接,为什么还要包含 foo.h 呢?好吧,因为 foo.h 具有我在使用库中的函数时需要的数据类型和枚举的所有定义。其中有很多,其中一些很复杂,所以这似乎是一种简单的方法来掌握它们。它似乎在我的第一次测试中起作用。

但是,我找不到任何使用 dlopen() 的示例,其中还包含库头,所以恐怕我在做一些完全愚蠢的事情。我以前从未使用过动态链接。那么这是正确的方法吗?

【问题讨论】:

    标签: c header dynamic-linking dlopen


    【解决方案1】:

    这取决于使用的链接器。如今,大多数链接器都支持所谓的“惰性”库链接,其中链接器将创建胶合代码,仅在首次使用时尝试加载库。这不适用于任何库,但对于大多数共享库来说这很好。然后,您可以使用dlsym/RTLD_GLOBAL 测试该库是否可用,如果不可用,则不调用这些函数。

    Os X 链接器支持与-lazy-l[lib] 的延迟链接。对于 linux,我相信它是 -z lazy -l[lib],但我从未在 Linux 上尝试过。

    【讨论】:

    • 我使用惰性链接,它工作正常。有问题的代码是这样的:github.com/ejurgensen/forked-daapd/blob/spotify/src/spotify.c。我认为它有两个问题:1)我包含 libspotify/api.h 来获取数据类型,与我见过的所有示例相反,2)分配函数指针是一个丑陋的三步过程
    【解决方案2】:

    现在可能无关紧要,但您正在寻找的是一个 import library 即一个存根库,它会提供假函数符号,当被调用时,它将通过 dlopen 搜索和加载库并重定向到真正的实施。

    this answer 中提供了如何实现此目的的示例。您还可以使用Implib.so tool 为给定的共享库自动生成导入库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多