假设我正在开发一个静态库foo.a
,它使用bar.so
.
我如何以这样一种方式构建这个库,使得foo.a
在他们的项目中使用的任何人都不必显式链接到bar.so
?
假设我正在开发一个静态库foo.a
,它使用bar.so
.
我如何以这样一种方式构建这个库,使得foo.a
在他们的项目中使用的任何人都不必显式链接到bar.so
?
您可以做的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
。
从扩展来看,您正在寻找一种 Unix 方式;据我所知,g++ 和 clang++ 都不能做到这一点。
Visual C++ 可能可以做到——我只将它用于静态库,而不是 DLL,但是......