2013-03-22 27 views
1

我想从我的共享库(.so)访问类符号 这是我需要的正确方法。使用dlsym访问类符号

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

如果这是正确的方法,那么我应该有我的MyClass标题用于投射。 我想知道是否有任何其他方式可以做到这一点,而不包括标题?

感谢

+0

你能澄清一下吗?你说“类符号”,但你可能意指的是“类型的全局变量”指向类“”的实例的指针。是这样吗? – Arkadiy

+0

@Arkadiy:是的,那是我需要的。然而,编译上面提到的代码,我需要包括MyClass标题,我想知道是否有可能避免这种情况? –

+0

如果不包含头文件,编译器应该如何知道'MyClass'是什么。另外,实际上'MyClass'是什么,是由'phandle'指向的?对象或类定义? –

回答

1

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

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

class MyClass instance; 

,对dlsym将返回&instance值。那里没有其他信息。到dlsym,instance只是一个内存区域的地址。如果你有

char instance[sizeof(MyClass)] 

你会得到完全相同的价值。

因此,要回答你的问题 - 不,没有知识的地址dlsym返回符号的内容。你必须自己添加这些知识。这就是为什么你必须投下dlsym的结果,这就是为什么你需要包含头文件。

1

dlsym的唯一符号是 对应于内存中的东西:对象或函数。 一个类的名字既不是。你可以得到一个指向类类型的对象 的指针,但是你不能对它做任何事情(甚至是类类型的名字 ),而没有头部的地方。 (您可以使用 类的前进定义在您做 dlsym点,但由于没有什么,你可以用一个指针 一个不完整的类型做,这不给你买太多了void*。)