一种定义规则是否适用于在运行时动态加载共享库?
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都包含一个名为global1
的int
类型的全局变量。因为 dlsym
函数 returns 指向有问题的 variable/function 的指针,所以您可以处理这种情况而不会发生冲突。
如果我在运行时使用 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都包含一个名为global1
的int
类型的全局变量。因为 dlsym
函数 returns 指向有问题的 variable/function 的指针,所以您可以处理这种情况而不会发生冲突。