gpt4 book ai didi

c++ - 如何在不强制最终用户链接这些库的情况下在静态库中使用共享库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:55 25 4
gpt4 key购买 nike

假设我正在开发一个静态库 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 库,如果是 C++ 库,函数应该是 extern "C",以便您正确找到函数名。否则,您将需要修改名称以使用 dlsym 查找函数。您可以在库上使用 objdump -T 来检查库中的名称是否被损坏。

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

关于c++ - 如何在不强制最终用户链接这些库的情况下在静态库中使用共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com