为了进行测试,我想从应用程序加载共享库的两个实例。库中的代码提供了API,但由于某些功能依赖于静态变量,因此它不允许我初始化库的两个(或多个)实例。
我目前正在为此lib编写单元测试,并且我想拥有两个实例,因为这将大大简化我的测试。
该库未链接到该程序。相反,我直接使用LoadLibrary / GetProcAddress(或linux上的dlopen / dlsym)加载它。为了区分这两个库,我可以为要加载的功能指针使用不同的名称…
这里是问题:
是否可以两次加载这样的库?例如,该库的所有加载实例都应获得自己的数据段,并且不会相互影响。
如果是这样:Windows和Linux是否可移植?
从理论上讲,如果将库编译为与位置无关的代码(-fPIC),则可以加载两次。
-fPIC
在某些Unices上,dlopen如果加载程序有一个RTLD_PRIVATE标志,或者通过具有相同符号的两个“不同”库副本(将其放在两个不同的路径上,则它可以返回第一个文件句柄),然后可以对该库执行两次操作,并使用打开它们RTLD_LOCAL。
dlopen
RTLD_PRIVATE
RTLD_LOCAL
我对Windows共享库一无所知。甚至不可能。