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

标签 c++ c dll loadlibrary one-definition-rule

如果我在运行时使用 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/

相关文章:

c++ - 哪里应该使用ncurses刷新()?

java - Android中是否有可用的视频编辑库

c++ - 如何正确终止 dll 中的挂起线程?

c# - 为什么我收到 'an unhandled exception of type system executionengineexception occurred in system data dll' 错误?

c++ - 在标准库中静态链接时如何支持动态插件?

c++ - 我可以在 sqlite3 中为表名使用参数吗?

c - 当我释放字符串数组时,我的程序崩溃了

c++ - 将内存项保留在 RAM 中,不允许将其分页到磁盘

c++ - 尝试使用 strcpy 时看到应用程序崩溃

c++ - 在UB中执行多个后缀表达式(下标)评估结果