2017-04-22 100 views
0

.so文件我有一個.so文件,我需要使用的方法在我的C++代碼。沒有頭文件。我通過nm反編譯必要的符號,找到的方法和類信息如下。使用無頭文件

00000000002ec9c0 B CFTDOrderField::m_Describe 
0000000000067440 W CFTDOrderField::DescribeMembers() 

經過我的學習,我想我應該使用動態加載解決方案。但我不知道如何定義dlsym的返回類型,任何人都可以給我一些提示或解決方案嗎?謝謝!!

+0

'dlopen的/ dlsym'沒有優勢「正常」的鏈接;他們也不會替換丟失的頭文件,你必須重新創建 - 這並不容易。也可能違反版權法。 –

回答

-1

這不是簡單的任務。一般來說,你不能簡單地在這裏使用dlsym。與C不同的是,C++對符號名稱進行了修改,但是對於同一個編譯器來說,修改標準可能因實現的不同而不同,甚至會因版本而異。你仍然可以使用按照C約定導出的函數,但是我擔心,如果沒有頭文件,使用整個類型(C++類)將是不可能的。

遲緩裝載並且使用共享對象導出類始終用C相當棘手++。您可以在this教程中使用的特殊功能,如,或者您也可以使用更先進的技術,如factories,最後,你可以依靠你的編譯器/連接器(所有流行的現代編譯器都支持這一點),但您需要了解的類型,你的一些信息無論哪種方式」重新使用你的程序,這個信息應該在編譯時可用。這些信息包含在頭文件中。所以,你的問題的答案是相當消極的。

在名稱重整以及爲什麼它是「邪惡」看到評論鏈接。 (不要把這個文生義 - 這是你的技術原因,即使該功能使生活困難有時:-))

+0

嗨,@rfx,我不明白你的意思。你能幫忙解釋更多細節嗎? – user2933783

+0

對不起。 http://www.geeksforgeeks.org/extern-c-in-c/這可能會讓你明白我在說什麼,以及爲什麼在用C++編寫的共享對象上使用'dlopen'是非常棘手的。您可能會發現這篇文章也有幫助https://en.wikipedia.org/wiki/Name_mangling。 – rfx