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

问题描述

如果在运行时使用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函数返回指向相关变量/函数的指针,因此您可以无冲突地处理这种情况。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...