加载共享库的两个实例

时间:2010-08-08 07:54:12

标签: c windows linux dll

对于测试,我想从应用程序加载两个共享库实例。库中的代码提供了API,但它不允许我初始化库的两个(或更多)实例,因为某些函数依赖于静态变量。

我目前正在为这个lib编写单元测试,我希望有两个实例,因为这会简化我的测试。

图书馆没有链接到该计划。相反,我使用LoadLibrary / GetProcAddress(或Linux上的dlopen / dlsym)直接加载它。为了区分这两个库,我可以简单地为我正在加载的函数指针使用不同的名称......

以下是问题:

  • 是否可以加载这样的库两次?例如。所有加载的库实例应该获得自己的数据段,并且不会相互影响。

  • 如果是这样的话:这适用于Windows和Linux吗?

2 个答案:

答案 0 :(得分:9)

如果将库编译为与位置无关的代码(-fPIC),理论上可以加载两次库。

在某些Unices上,如果您的加载程序具有dlopen标记,或者通过具有相同符号的库的两个“不同”副本,则可以RTLD_PRIVATE两次库(将其放在两个不同的路径,否则它只返回第一个文件句柄),并用RTLD_LOCAL打开它们。

我对Windows共享库一无所知。甚至可能都不可能。

答案 1 :(得分:3)

至少在Windows上,您可以重命名该库,并加载它们。