2013-03-22 26 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*。)