对于测试,我想从应用程序加载两个共享库实例。库中的代码提供了API,但它不允许我初始化库的两个(或更多)实例,因为某些函数依赖于静态变量。
我目前正在为这个lib编写单元测试,我希望有两个实例,因为这会简化我的测试。
图书馆没有链接到该计划。相反,我使用LoadLibrary / GetProcAddress(或Linux上的dlopen / dlsym)直接加载它。为了区分这两个库,我可以简单地为我正在加载的函数指针使用不同的名称......
以下是问题:
是否可以加载这样的库两次?例如。所有加载的库实例应该获得自己的数据段,并且不会相互影响。
如果是这样的话:这适用于Windows和Linux吗?
答案 0 :(得分:9)
如果将库编译为与位置无关的代码(-fPIC
),理论上可以加载两次库。
在某些Unices上,如果您的加载程序具有dlopen
标记,或者通过具有相同符号的库的两个“不同”副本,则可以RTLD_PRIVATE
两次库(将其放在两个不同的路径,否则它只返回第一个文件句柄),并用RTLD_LOCAL
打开它们。
我对Windows共享库一无所知。甚至可能都不可能。
答案 1 :(得分:3)
至少在Windows上,您可以重命名该库,并加载它们。