我想從我的共享庫(.so)訪問類符號 這是我需要的正確方法。使用dlsym訪問類符號
MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");
如果這是正確的方法,那麼我應該有我的MyClass標題用於投射。 我想知道是否有任何其他方式可以做到這一點,而不包括標題?
感謝
我想從我的共享庫(.so)訪問類符號 這是我需要的正確方法。使用dlsym訪問類符號
MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");
如果這是正確的方法,那麼我應該有我的MyClass標題用於投射。 我想知道是否有任何其他方式可以做到這一點,而不包括標題?
感謝
如你所知,對dlsym返回基本上void *
- 一個無類型指針。
該指針是一個符號的地址 - 只是一個數字。如果你在你的。所以有
class MyClass instance;
,對dlsym將返回&instance
值。那裏沒有其他信息。到dlsym
,instance
只是一個內存區域的地址。如果你有
char instance[sizeof(MyClass)]
你會得到完全相同的價值。
因此,要回答你的問題 - 不,沒有知識的地址dlsym
返回符號的內容。你必須自己添加這些知識。這就是爲什麼你必須投下dlsym
的結果,這就是爲什麼你需要包含頭文件。
dlsym
的唯一符號是 對應於內存中的東西:對象或函數。 一個類的名字既不是。你可以得到一個指向類類型的對象 的指針,但是你不能對它做任何事情(甚至是類類型的名字 ),而沒有頭部的地方。 (您可以使用 類的前進定義在您做 dlsym
點,但由於沒有什麼,你可以用一個指針 一個不完整的類型做,這不給你買太多了void*
。)
你能澄清一下嗎?你說「類符號」,但你可能意指的是「類型的全局變量」指向類「」的實例的指針。是這樣嗎? – Arkadiy
@Arkadiy:是的,那是我需要的。然而,編譯上面提到的代碼,我需要包括MyClass標題,我想知道是否有可能避免這種情況? –
如果不包含頭文件,編譯器應該如何知道'MyClass'是什麼。另外,實際上'MyClass'是什麼,是由'phandle'指向的?對象或類定義? –