如何在静态库中使用共享库而不强制最终用户链接这些库?

时间:2012-07-06 21:20:59

标签: c++ static-linking dynamic-linking

假设我正在使用静态库foo.a,它使用bar.so中的函数。

如何以这样的方式构建此库:在项目中使用foo.a的任何人都不必明确链接bar.so

2 个答案:

答案 0 :(得分:4)

您在libfoo.a可以执行的操作是拨打dlopen来动态链接libbar.so。然后,使用dlsym找到您要使用的功能。

typedef void (*BarFunctionType) (const char *);
FunctionType barFunction;

void initialize_foo_lib () {
    void *h = dlopen("libbar.so", RTLD_LAZY);
    BarFunctionType barFunction = (BarFunctionType) dlsym(h, "barFunction");
    // Note scary looking cast to get your function pointer.
    //... rest of code can call barFunction now
}

libbar.so应该是一个C库,或者如果是C ++库,该函数应该是extern "C",以便您正确地找到函数名。否则,您需要修改名称以找到dlsym的函数。您可以在库上使用objdump -T来检查库中的名称是否被破坏。

意识到仍然存在libbar.so的依赖关系,但它已经融入您的静态库中。因此libfoo.a的用户在-lbar中链接时不必将-lfoo添加到链接行。

答案 1 :(得分:0)

从扩展来看,你正在寻找一种Unix方式;据我所知,g ++和clang ++都不能这样做。

Visual C ++可能会这样做 - 我只将它用于静态库,而不是DLL,但是......