2009-04-20 62 views
8

我正在將大型C++應用程序從Linux(gcc)移植到Windows(Visual C++ 2008),並且在插件方面存在鏈接器問題。在Linux上這不是問題,因爲.so支持運行時符號查找,但dll似乎不支持這一點。Visual C++ - 針對EXE鏈接插件DLL?

一些背景信息: 承載腳本環境的應用程序(主機)爲插件(在運行時通過腳本API調用而加載的共享庫)提供接口,允許擴展主機和腳本API而無需重新編譯主機應用程序。在Linux上,這只是將主機應用程序的頭文件包含在插件源中的問題,但在Windows中,我收到鏈接程序錯誤。我不確定我需要鏈接的Visual C++來解決這些符號。

我們的一個依賴項(開源,LGPL)具有預處理程序聲明,它用於將__declspec(dllexport)和__declspec(dllimport)插入到它的標題中。一些先前的研究表明,我可能也必須這樣做,但我想確保在修改一大堆核心標題之前。 (我以前能夠在MinGW上工作,但是我們已經決定支持Visual Studio是這類商業項目的必備條件。)

我的問題,簡而言之:如何鏈接運行時環境,加載DLL對Visual C++中的宿主exe文件?

編輯:澄清用一個例子的問題,我在我的主機應用程序的一類,對象,其代表了可以由腳本訪問的對象的基本類型。在我的插件中,我有許多類,它們擴展了對象以執行其他功能,例如集成網絡支持或新的視覺元素。這意味着我的dll必須鏈接主機exe中的符號,我不知道該怎麼做。

+0

我有點麻煩纏着這個。如果你有一個具體的例子,並簡化爲幾行代碼,也許這可能會幫助大家幫助你。 – ojblass 2009-04-20 23:36:54

回答

5

「運行時符號查找」是什麼意思?你的意思是動態加載庫使用dlopendlsymso onequivalents in Windows被稱爲LoadLibraryGetProcAddress

在Windows中,您不會從可執行文件導出符號。你應該只從dll中導出它們。解決問題的正確方法是重新構建,以便導出的符號位於可執行文件和其他插件DLL可以鏈接的dll中。

+0

就是這樣,我可以做到這一點,但我不知道如何編譯該DLL與在我的主機可執行文件中定義的符號(請參閱我最近的編輯) – 2009-04-20 22:40:31

1

你不能,很容易。 Windows加載程序不用於將符號導出EXE,並將它們綁定到DLL中的符號。

我看到的一種模式是DLL導出EXE調用的某個函數。它需要一個包含EXE中DLL函數地址的結構作爲參數。

1

1800年信息稱,不要這樣做。將對象移出可執行文件並移入「第三個」DLL。將插件和可執行文件連接起來。

1

我一直在實現同樣的目標,構建一個在Linux和Windows下構建的插件庫。

Linux下的解決方案是在gcc命令行中使用-rdynamic選項。這會導出主可執行文件中的所有符號,以便插件可以在加載時找到它們。

在Windows下,解決方案是在您希望dll使用的exe文件中定義這些函數的前面添加__declspec(dllexport)。編譯將爲dll創建一個.lib文件以鏈接到。當然在Visual Studio 2008下工作。 Related posts:https://stackoverflow.com/a/3756083/1486836