由于某些限制,我被迫在运行时加载用C编写的库。第三方为我提供了两个库作为静态存档,我们将其转换为共享对象。我正在使用的应用程序根据一些硬件参数在运行时加载其中一个库。不幸的是,其中一个库主要配置了全局变量。
我已经在使用dlsym加载函数引用了但是我可以使用dlsym加载对这些全局变量的引用吗?
答案 0 :(得分:11)
是的,您可以使用dlsym访问全局变量(只要它们被导出,而不是静态)。下面的例子是在C ++和Mac中,但显然C可以正常工作。
<强> lib.cpp:强>
extern "C" {
int barleyCorn = 12;
}
<强> uselib.cpp 强>
#include <dlfcn.h>
#include <iostream>
using namespace std;
main()
{
void * f = dlopen ("lib.dylib", RTLD_NOW);
void * obj = dlsym (f, "barleyCorn");
int * ptr = (int *) obj;
cout << *ptr << endl;
}
<强>输出:强>
% ./a.out
12
答案 1 :(得分:1)
是的,您可以使用dlsym()
在动态库中找到任何导出的符号。
答案 2 :(得分:1)
是的,您可以而且我实际上更愿意这样做而不是加载功能。我的标准IOC模型就是这样做的。
我更喜欢它,因为:
从void *转换为指向对象的指针在技术上比函数指针更安全,尽管显然使用void *和dlsym的系统必须允许转换指针。 (Microsoft的GetProcAddress返回它们自己的指针类型,在这种情况下,我认为这是一个更好的选择,因为如果需要,它们可以在以后改变它的实际含义)。
因为我在C ++中这样做,我可以强制执行任何这样的导出对象派生自公共基类,然后我可以使用该类中的dynamic_cast到我期望的实际类。这意味着如果它不是从后面的类派生的话我可以捕获一个错误,以后会保存运行时错误。