C / C ++中的dlopen和全局变量

时间:2011-01-12 16:39:20

标签: c++ c dlopen

由于某些限制,我被迫在运行时加载用C编写的库。第三方为我提供了两个库作为静态存档,我们将其转换为共享对象。我正在使用的应用程序根据一些硬件参数在运行时加载其中一个库。不幸的是,其中一个库主要配置了全局变量。

我已经在使用dlsym加载函数引用了但是我可以使用dlsym加载对这些全局变量的引用吗?

3 个答案:

答案 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到我期望的实际类。这意味着如果它不是从后面的类派生的话我可以捕获一个错误,以后会保存运行时错误。