问题描述
如果在运行时使用Unix上的dlopen()或Windows上的LoadLibrary()在运行时加载dll或类似的库,我是否需要确保该库中的符号名称与程序中的符号名称不同?还可以加载定义相同功能的多个共享库吗?
编辑:我专门询问运行时动态链接。
解决方法
由dlopen
加载的共享库中的对象未出现在主程序的名称空间中。您需要使用对象名称作为字符串调用dlsym
,以获得指向它的指针。
以您的示例为例,该示例具有两个具有相同名称的全局变量的动态加载的库:
void *lib1 = dlopen("lib1.so",RTLD_LAZY);
int *lib1_global1 = dlsym(lib1,"global1");
void *lib2 = dlopen("lib2.so",RTLD_LAZY);
int *lib2_global1 = dlsym(lib2,"global1");
在此,lib1.so和lib2.so都包含名为int
的类型global1
的全局变量。由于dlsym
函数返回指向相关变量/函数的指针,因此您可以无冲突地处理这种情况。