2011-08-19 165 views
0

我想在C++中編寫一個跨平臺的程序,它將在運行時加載某些模塊(共享庫)。爲此,我使用Poco C++ Libraries的ClassLoader。我用autoconf,automake和libtool編寫了一個編譯鏈。這在Linux環境中應該不會有問題,但是在Windows中會出現問題。編譯時我使用MinGW和MSYS以便能夠使用我的Makefiles。 ClassLoader使用Windows特定的LoadLibrary()函數來加載模塊,這意味着我必須將它們編譯爲DLL。在Windows上使用Libtool和LoadLibrary()的模塊

我編譯爲一個庫的類繼承了主應用程序中的另一個類。然後當我嘗試運行make時,它會抱怨很多未定義的引用,並拒絕構建共享庫。我想這是因爲這個名字被破壞。或者是因爲我無法繼承庫之外的類? (該類不包括在圖書館的來源,但頭文件被發現)

我真的不知道它會帶來多少麻煩,我堅持在MinGW + MSYS下編譯,但仍然使用的LoadLibrary()。有這方面經驗的人嗎?

+0

我已經使用'LoadLibrary'與DLL使用MinGW/libtool構建沒有太多的麻煩。我認爲你的問題可能與C++/DLL混合有關。顯示問題的(簡短)示例代碼可能很有用。 – rodrigo

+0

謝謝。事實證明,MinGW + LoadLibrary的組合不是問題,而是它如何鏈接。我已將所有常見類放入一個共享庫中,並將其鏈接到可執行文件和模塊。 – roggan87

回答

0

在Windows下,一個DLL必須有全部它的符號在構建時解析。在Unix下,您可以在加載時間之前解決問題,並且此行爲目前已融入到您的設計中。

要改變這種情況,您可能必須將主應用程序(以及DLL依賴的其他所有內容)中的基類分解到它自己的DLL中。這樣,當你鏈接你的類的子類時,它可以鏈接到新的DLL並完全解析它的符號。 問題是,您必須能夠構建這個新的DLL,並解析所有的符號。