假设我正在使用静态库foo.a
,它使用bar.so
中的函数。
如何以这样的方式构建此库:在项目中使用foo.a
的任何人都不必明确链接bar.so
?
答案 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,但是......