2014-01-15 70 views
3

這與驗證我的推理非常相似。交叉編譯器庫交互(動態加載)(插件)

無論如何,我正在開發一個支持插件(在運行時動態加載庫)的複雜項目,現在我希望能夠使用編譯器X編譯主程序,並使用編譯器Y編譯插件,和插件仍然工作。 但是我需要在插件和主程序之間傳遞複雜的數據。

所以我的理解是標準函數沒問題,編譯器無關緊要,只要我知道他們將執行相同的基本代碼的地址。

但是,當涉及到結構時,由於編譯器之間的對齊/打包方法不同,2個相同的結構可能不相同,但是我可以在大多數編譯器上使用#parama pack(n)來覆蓋它,只要這是相同的內存這些結構的結構將匹配,因此它們可以在插件和主程序之間傳遞。

現在我相信只要沒有虛函數,並且所有成員變量都是公共的,這對基本類也是適用的。然而,我不能解除成員函數的調用約定,所以我必須通過標準函數來映射它們,該函數將對象作爲參數,或者在插件名稱空間中重新實現它們,很可能通過庫與之相關聯。

此外,只要按上述方式實現,我應該能夠爲結構體/類實現運算符和成員函數。

因此,我可以使用它來傳遞插件和程序之間的複雜數據,即使它們是用不同的編譯器編譯的。

我對我的理解正確嗎?

回答

4

是的,你似乎有很多重要的點。本質上,DLL只能公開C級接口,而不是C++提供的許多漂亮功能。 (儘管它仍然可以使用C++內部的課程。)

你沒有提到的重要一點是,通過一個插件分配的任何內存必須以相同的插件被釋放。同樣,主程序必須是解除分配的任何內容的程序。你可以來回傳遞內存地址並且使用它們,但是釋放是一種特殊情況,因爲不同的編譯器可能會使用不同的堆棧實現。因此,如果人們首先嚐試清理不負責的內存,那麼可能會發生不好的事情。