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

Aar*_*ing 5 c c++ dll loadlibrary one-definition-rule

如果我在运行时使用 unix 上的 dlopen() 或 Windows 上的 LoadLibrary() 加载 dll 或 so 库,我是否需要确保库中的符号与程序中的符号名称不同?另外是否可以加载定义相同函数的多个共享库?

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

dbu*_*ush 2

加载的共享库中的对象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");
Run Code Online (Sandbox Code Playgroud)

int这里,lib1.so 和 lib2.so 都包含一个名为类型的全局变量global1。因为该dlsym函数返回指向相关变量/函数的指针,所以您可以处理这种情况而不会发生冲突。