我想从我的共享库(.so)中访问一个类符号这是我需要做的正确方法吗?
MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");
如果这是正确的方法,那么我应该有我的 MyClass 标头进行转换。我想知道是否有其他方法可以在不包括标题的情况下做到这一点?
谢谢
如您所知, dlsym 基本上返回void *
- 一个无类型的指针。
该指针是符号的地址 - 只是一个数字。如果你有
class MyClass instance;
在您的 .so 中,dlsym 将返回 .so 的值&instance
。那里没有其他信息。To dlsym
,instance
只是一个内存区域的地址。如果你有
char instance[sizeof(MyClass)]
你会得到完全相同的值。
所以,回答你的问题 - 不,不知道地址dlsym
返回的符号的内容。您必须自己添加这些知识。这就是为什么你必须转换结果,dlsym
这就是为什么你需要包含头文件。
您可以使用的唯一符号dlsym
是那些与内存中的某些东西相对应的符号:对象或函数。一个类的名称都不是。您可以获得指向类类型对象的指针,但是如果在某处没有标头,您将无法对它做任何事情(甚至命名类类型)。(您可以在执行 . 时使用类的前向定义
dlsym
,但是由于您无法使用指向不完整类型的指针来做任何事情,因此这不会给您带来太多好处void*
。)