如果在运行时使用Unix上的dlopen()或Windows上的LoadLibrary()在运行时加载dll或类似的库,是否需要确保库中的符号与程序中的符号名称不同?还可以加载定义相同功能的多个共享库吗?
编辑:我专门询问运行时动态链接。

最佳答案

dlopen加载的共享库中的对象不会出现在主程序的 namespace 中。您需要使用对象名称作为字符串调用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都包含一个名为intglobal1类型的全局变量。由于dlsym函数返回指向相关变量/函数的指针,因此您可以无冲突地处理这种情况。

08-25 22:32