簡體   English   中英

如何在共享庫中執行某些功能

[英]How to execute some function in a shared library

我想知道如果程序沒有一起編譯,怎么能“重新識別”某些可執行文件或共享庫中的某些功能。 我知道這聽起來令人困惑,這是一個非常詳細的解釋:

假設我有一個名為“ A”的程序。 現在,我想在某些指定位置放置一些附加的已編譯共享庫“ B”,以便“ A”可以在其中運行功能,而無需更改A本身的代碼。 當然,我也可以使用一些其他文件,例如txt文件,並且源代碼是可見的。 我應該如何設計整個系統,使其能夠正常工作?

如果您將其視為游戲,例如將其視為紙牌游戲,那么情況就是這樣。 您擁有游戲,並且堅持只編寫C ++(因此必須編譯所有內容)。 現在您已經擁有了發布的游戲。 但是有些DIYer想要在游戲中添加一些新卡(它們不能更改可執行文件本身,因為如果有多個DIY,該怎么辦?)。 您可以通過txt或db或其他方式來處理卡片數據,但是對於“效果”部分,您必須進行編碼並將其編譯為某種形式。 主程序應如何在已編譯的庫中調用卡片的“效果”功能?

順便說一句,我知道我可以使用LUA之類的sript語言來完成此操作,但是如果我想以“編譯方式”進行操作,該怎么辦?

這是更具體的示例:

A.cpp:int main(){FuncA(); FuncB(); FuncC(); ...} //其他

B.cpp:int TheFunction(){....} //就這樣

該程序不知道“ B”的存在,但它的設計目的是,如果我可以將B編譯為某種B.so,並將其放在指定的文件夾中,則“ A”可以執行TheFunction()

我知道聲音確實會發出,但是我在想什么:

編譯B時,請使用某種方式使編譯器生成指向txt文件的某種函數指針列表。 然后程序A讀取該文件,並在B中運行指針指向的功能。

那可能嗎? 還是我實際上理解錯了?

動態鏈接不是C ++標准所涵蓋的,因此它的工作方式取決於實現。 例如,在Windows上,您將構建一個DLL,然后使用LoadLibrary()動態加載它,並使用GetProcAddress()獲得指向您要調用的函數的指針。 其他平台使用不同的API提供類似的功能。

當然,C ++是靜態編譯的語言,因此您需要先了解函數的簽名,然后才能調用它。 您的程序必須為“插件”定義一些標准功能接口,以便在DLL中實現,以便能夠調用在原始程序構建后編寫的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM