1

我想从我的共享库(.so)中访问一个类符号这是我需要做的正确方法吗?

MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");

如果这是正确的方法,那么我应该有我的 MyClass 标头进行转换。我想知道是否有其他方法可以在不包括标题的情况下做到这一点?

谢谢

4

2 回答 2

1

如您所知, dlsym 基本上返回void *- 一个无类型的指针。

该指针是符号的地址 - 只是一个数字。如果你有

class MyClass instance;

在您的 .so 中,dlsym 将返回 .so 的值&instance。那里没有其他信息。To dlsym,instance只是一个内存区域的地址。如果你有

char instance[sizeof(MyClass)]

你会得到完全相同的值。

所以,回答你的问题 - 不,不知道地址dlsym返回的符号的内容。您必须自己添加这些知识。这就是为什么你必须转换结果,dlsym这就是为什么你需要包含头文件。

于 2013-03-22T12:43:28.033 回答
1

您可以使用的唯一符号dlsym是那些与内存中的某些东西相对应的符号:对象或函数。一个类的名称都不是。您可以获得指向类类型对象的指针,但是如果在某处没有标头,您将无法对它做任何事情(甚至命名类类型)。(您可以在执行 . 时使用类的前向定义 dlsym,但是由于您无法使用指向不完整类型的指针来做任何事情,因此这不会给您带来太多好处void*。)

于 2013-03-22T12:44:17.823 回答