如果我在运行时使用 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
函数返回指向相关变量/函数的指针,您可以处理这种情况而不会发生冲突。
关于c++ - 一个定义规则是否适用于在运行时动态加载共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769268/