2011-04-18 53 views
2

我搜索了這個特定的問題,但不能得出任何結果,既不在這裏也不在線上(可能是因爲它對我來說有點困難)。如果它已經被問到,請指出正確的方向。爲插件支持準備一個庫

我希望我的圖書館/軟件可以插入。我看到所有這些插件被廣泛使用的各種庫和系統,作者自誇地指出(以一種好的方式!)他們的軟件具有插件支持。

所以我的問題是,我從哪裏開始?是否有任何書籍/在線資源可以打破僵局,並且可以指導一個關於do的方法,而不要讓你的庫可插入,定義最佳實踐等等?

+0

首先在本網站上搜索您的確切標籤,即「[C++] [plugins]」和按票數排序。那裏的第一個問題會讓你失望。投票結束。 – Mat 2011-04-18 14:19:10

+0

幾年前,Dobbs博士還有一篇文章,這篇文章的內容是:http://drdobbs.com/cpp/204202899?pgno = 1。這是一篇包含5部分的文章,其他部分的鏈接位於第一部分的頂部。 – dgnorton 2011-04-18 14:44:18

回答

1

你開始之前,瞭解一些事情:

  1. 沒有爲模塊標準C(靜態或動態)++不支持。不。還沒。也許在2015年。
  2. Dll(或類似unix的系統上的.so)是動態加載的庫,它們是依賴於編譯器/操作系統的。所以這是一個滿足需求的實用解決方案。

所以,你將不得不使用共享庫(無論文件擴展名,它是關於這個主題的搜索關鍵字)作爲插件二進制文件。如果您的插件應包含多個運行時代碼(如圖形資源),則可以將圖形資源包含在二進制文件中,或者使用包含二進制文件的文件格式或壓縮archibe。

無論您如何設置插件文件,在C++中,問題都是關於界面。根據你使用的編譯器,你將有不同的方式來標記函數或類作爲導出/導入(這意味着你的插件源代碼導出代碼,插件的用戶應該導入代碼)。

在C++中爲模塊設置乾淨清晰的接口,沒有模板(因爲它們依賴於編譯器和編譯器配置)。這些接口應該是函數聲明和類聲明,不帶內聯代碼並標記爲導出/導入。

現在,一旦您掌握了這一點,就可以使用特定於操作系統的API在應用程序運行時加載/卸載動態庫二進制文件。一旦完成,您可以獲得指向函數的指針,再次使用特定於操作系統的API。我讓你搜索它。

現在,有些庫提供了以跨平臺的方式來抽象它的方法。我並沒有使用它們,它們是已知的,因爲缺乏在C++標準定義是不完美的,但如果你打算讓應用程序跨平臺的,他們可能是有用的:

  • boost::extension:它還不是一個提升庫,甚至還沒有提出,它的開發是暫停的(直到一些新的標準C++實現完成),所以這可能是一個壞主意,但很多人說他們成功地使用它。
  • POCO librarie s有a library for shared libraries這將相當於boost :: extension。很多人都說它很有用,所以我覺得它足夠好用。

如果你不需要支持大量的目標平臺,那麼很容易設置的另一種方法就是在操作系統特定的API上編寫一些包裝代碼。這就是我在瞭解boost :: extension之前所做的事情。