4

假设我正在开发一个静态库foo.a,它使用bar.so.

我如何以这样一种方式构建这个库,使得foo.a在他们的项目中使用的任何人都不必显式链接到bar.so

4

2 回答 2

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 库,或者函数应该是extern "C"C++ 库,以便您正确找到函数名称。否则,您将需要修改名称以使用dlsym. 您可以objdump -T在库上使用来检查库中的名称是否被损坏。

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

于 2012-07-06T21:43:18.463 回答
0

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

Visual C++ 可能可以做到——我只将它用于静态库,而不是 DLL,但是......

于 2012-07-06T21:47:49.867 回答