我的程序可以使用某个库(让我们称之为foo),这个库是非自由的。所以我不想在编译时和运行时都使它成为依赖。该库只提供了很好的额外功能,所以程序可以不用foo。所以我打算这样做:
那么,如果我打算使用动态链接,为什么还要包含foo.h?好吧,因为foo.h具有我在使用库中的函数时需要的数据类型和枚举的所有定义。有很多这些,其中一些是复杂的,所以它似乎是一个容易抓住它们的方法。它似乎在我的第一次测试中起作用。
但是,我找不到任何dlopen()用法的例子,其中也包含了库头,所以我担心我做的事情完全是愚蠢的。我之前从未使用动态链接。那么这是正确的方法吗?
答案 0 :(得分:0)
这取决于所使用的链接器。今天大多数链接器支持所谓的“懒惰”链接库,其中链接器将创建仅在首次使用时尝试加载库的粘合代码。这不适用于任何库,但对于大多数共享库,这很好。然后,您可以使用dlsym/RTLD_GLOBAL
来测试库是否可用,如果不是,则不会调用这些函数。
Os X链接器支持与-lazy-l[lib]
的延迟链接。对于linux,我相信它是-z lazy -l[lib]
,但我从来没有在Linux上尝试过。