2014-10-29 62 views
0

我在想如果一個程序在一些可執行文件或共享庫中如果沒有編譯在一起,它們如何「識別」某些功能。我知道這聽起來令人困惑,下面是一個非常詳細的解釋:如何在共享庫中執行某些功能

假設我有一個名爲「A」的程序。現在我想在某個特定位置放置一些額外的編譯共享庫「B」,以便「A」可以在其中運行函數,而不必更改A本身的代碼。當然,我也可以使用一些額外的文件,如txt文件,當然可以看到源代碼。我應該如何設計整個系統才能工作?

如果你把它想象成一個遊戲,E.G.一場紙牌遊戲,這裏就是情況。你有這個遊戲,並且你堅持寫純粹的C++(所以你必須編譯所有東西)。現在你已經有了公開的遊戲。但是一些DIYer想要在遊戲中添加一些新的卡(他們不能改變可執行文件本身,因爲如果有更多的那個DIY呢?)。您可以通過txt或db或其他方式來完成卡數據部分,但對於「效果」部分,您必須對其進行編碼並將其編譯爲某些內容。主程序應該如何在編譯的庫中調用卡「效果」功能?

順便說一句,我知道我可以用像LUA這樣的簡單語言來完成它,但是如果我想以「編譯的方式」來做呢?

下面是更具體的例子:

A.cpp:INT主(){FuncA的行(); FuncB();跳到FuncC(); ...} //和別的

B.cpp:INT TheFunction(){...} //這是它

程序不知道的 「B」 的存在,但它如果我可以編譯B到某種B.so,並將其放在指定的文件夾中,「A」可以執行TheFunction()我知道聲音真的可以使用,但這是我我在想:

編譯B時,使用某種方法讓編譯器生成某種類型的函數指針列表到一個txt文件。程序A讀取該文件,並運行指針指向B的函數。

這可能嗎?或者我真的理解錯了嗎?

+0

閱讀微軟的COM:http://en.wikipedia.org/wiki/Component_Object_Model。 – Kevin 2014-10-29 03:10:25

回答

0

動態鏈接不是由C++標準覆蓋的東西,所以這是如何工作的,取決於實現。在Windows上,例如,您將生成一個DLL,然後使用LoadLibrary()動態加載它,並使用GetProcAddress()獲取要調用的函數的指針。其他平臺使用不同的API提供類似的功能。

當然C++是一種靜態編譯的語言,因此您需要知道函數的簽名後才能調用它。你的程序必須定義一些標準的「插件」函數接口,以在DLL中實現,以便能夠調用在構建原始程序之後編寫的代碼。

+0

非常感謝!我從來沒有想過這會很簡單。所以一個DLL實際上在裏面記錄一個函數或變量名? – ZisIsNotZis 2014-10-29 11:57:55

+0

在Windows上,您必須使用__declspec(dllexport)明確聲明要導出哪些函數,但是,DLL具有導出函數及其地址的名稱表。如果您打算按名稱查找它們,請聲明您的函數extern「C」以防止C++名稱變形。 – mattnewport 2014-10-29 14:07:55