一种定义规则是否适用于在运行时动态加载共享库?

Does one definition rule apply to dynamically loading shared libraries at runtime?

如果我在运行时使用 unix 上的 dlopen() 或 windows 上的 LoadLibrary() 加载一个 dll 或 so 库,我是否需要确保库中的符号与我程序中的符号?是否可以加载定义相同功能的多个共享库?

编辑:我特意询问运行时动态链接。

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都包含一个名为global1int类型的全局变量。因为 dlsym 函数 returns 指向有问题的 variable/function 的指针,所以您可以处理这种情况而不会发生冲突。