【发布时间】:2014-01-08 18:07:37
【问题描述】:
我有一些函数,比如int foo(int x),它是从 DLL 获得的(使用 dlsym())。所以,目前我的代码看起来像这样:
void foo(int x) {
void (*foo)(int x);
foo = dlsym(dll_handle, "foo");
int y = foo(x);
printf("y is %d", y);
}
我想要的是(类似于)这段代码工作:
void bar(int x) {
int y = foo(x);
printf("y is %d", y);
}
所以foo() 是一个调用 dll 函数的存根(但不必每次都搜索 DLL)。
- 为单个功能实现此目标的最佳方法是什么?
- 对于许多函数的情况,如何避免编写一堆复制粘贴存根?考虑到签名,宏解决方案可能会很棘手。也许是基于 C++11 的可变参数参数模板?
在下面的答案中,我对 1. 的解决方案有一个基本想法,但我不太确定,我想在这里采用“最佳实践”方法。
【问题讨论】:
-
这肯定会起作用,但它永远不会在不再需要时使用
dlclose(3)卸载共享库。这可能没问题,但是如果您希望能够卸载库,则需要一个取消初始化函数,该函数将调用dlclose()并将dll_foo变量设置回NULL。