2012-09-22 36 views
1

我正在使用插件系統在跨平臺的c + +/qt項目上工作,我們在windows上使用linux和dll上的so文件。我們通過cmake在Linux和Visual Studio 2010上使用gcc。 問題是我們的插件有時需要從應用程序源代碼中調用一個函數,這個代碼只需包含頭文件即可在gcc上使用gcc工作。但在Visual Studio上,我們得到了無法解析的外部符號錯誤。解決在一個DLL中的外部符號

是因爲so和dll文件的工作方式不同嗎?

謝謝。

回答

2

在Windows上從dll導出符號的默認行爲完全相反:默認情況下,符號不可見,您需要明確導出它們。用VC++,這是通過__declspec(dllexport)declarators完成的。編輯(信息添加):您正在進入一個非標準化,系統特定行爲的區域......在C++中編寫跨平臺「可插入」組件系統的問題比您期望的要多得多。在Windows上有所謂的導入庫,它定義了從dll導出的所有符號。您必須鏈接這些庫才能解決這些符號。這叫做implicit linking。您也可以明確地鏈接,這意味着在運行時加載dll及其導出的符號。然而,與所謂的二進制兼容性問題相比,所有這些僅僅是技術細節,如果在組件系統的設計過程中未考慮這些問題,幾乎肯定會殺死您。

我在想一件事:你說你在用Qt。 Qt應用程序框架擁有自己的跨平臺約定和編寫和構建可插入組件的規則。你爲什麼不堅持這些......?

+0

是的,但這還不夠我似乎必須從主要的可執行文件鏈接* .lib。 – Jkmn

+0

我編輯了我的答案,希望事情變得更清晰一些...... –

+0

謝謝你繼續。所以如果我想我的dll編譯我需要鏈接從我的主應用程序構建的導入庫?這就是困擾我的東西。 – Jkmn