动态链接(使用dlopen)和C中的头包含

时间:2014-02-20 15:39:47

标签: c header dynamic-linking dlopen

我的程序可以使用某个库(让我们称之为foo),这个库是非自由的。所以我不想在编译时和运行时都使它成为依赖。该库只提供了很好的额外功能,所以程序可以不用foo。所以我打算这样做:

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

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

但是,我找不到任何dlopen()用法的例子,其中也包含了库头,所以我担心我做的事情完全是愚蠢的。我之前从未使用动态链接。那么这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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