簡體   English   中英

交叉編譯器庫交互(動態加載)(插件)

[英]Cross Compiler Library Interaction (Dynamic Loading) (plugins)

這對我的推理的驗證來說是一個很大的問題。

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

所以我的理解是標准函數很好並不重要,只要我知道它們將執行相同基本代碼的地址。

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

現在,我相信只要沒有虛函數,並且所有成員變量都是公共的,基本類也適用。

但是我不能放棄成員函數的調用約定,所以我必須通過一個標准函數來映射它們,這個函數將對象作為參數,或者在插件命名空間中重新實現它們,最有可能通過它鏈接的庫。

更多我應該能夠為結構/類實現運算符和成員函數,只要它們如上所述實現。

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

我在這里的理解是正確的嗎?

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

您沒有提到的一個重點是,插件分配的任何內存必須由同一個插件釋放。 類似地,主程序必須是釋放它分配的任何東西的程序。 您可以來回傳遞內存地址並使用它們,但是重新分配是一種特殊情況,因為不同的編譯器可能會使用不同的堆實現。 因此,如果一個人試圖清理它首先不負責的記憶,就會發生不好的事情。

暫無
暫無

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

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