2013-03-16 25 views
3

我有一個加載的主可執行文件。插件,它在Linux中但在Windows(Visual Studio 2012)中工作得很好,它會因未定義的引用錯誤而失敗。.dll使用主可執行文件中定義的函數的插件

該插件使用在主可執行文件中定義的功能,如session->SendLine("bla")。 (包含在插件中的.h中定義的會話ans方法的類,但是在主exec中編譯的.cpp中的實際函數)。

TL;博士:「我需要在Windows連接忽略插件未定義的引用,在主可執行文件中定義的」

什麼是「使工作」的窗口,但保持兼容Linux的最佳途徑沒有一百萬#ifdef的?

+0

你能共享至少插件的接口頭嗎? – 2013-03-16 21:41:14

+0

interface:http://privatepaste.com/c6118a7e85 example_plugin:http://privatepaste.com/dd152f6c64 session-> Send()== void session :: Send(CString str){... send something via插座...} – Naga 2013-03-16 22:54:02

+0

我已經張貼直接在問題的頭,好像頭是準備從Windows POV ... – 2013-03-16 22:58:00

回答

3

在Windows上鍊接庫的處理方式與在Linux上處理鏈接完全不同。在Linux上,從插件鏈接到主機可執行文件很簡單,但在Windows上並不多。

在Windows上,鏈接到外部模塊的傳統方式是使用由.lib文件提供的導入庫。爲了這樣做,您需要爲您的可執行文件創建一個導入庫,其中包含您的插件需要調用的所有導出函數。我從來沒有爲可執行文件創建一個導入庫。通常你會爲DLL做這件事。我甚至不確定它是否適用於可執行文件。

其他一些選項:

  1. 導出從可執行文件的功能,並在你的插件使用GetProcAddress綁定到它們在運行時。
  2. 初始化插件時,傳遞一個包含它們所需的所有功能的接口。
2

要調用DLL中的可執行文件中定義的函數,必須使用__declspec(dllexport)從可執行文件中導出這些函數,就像從DLL中導出函數一樣。

編譯器將爲可執行文件生成一個導入庫,該庫包含導出函數的存根。

生成DLL時與此導入庫鏈接。

2

當使用mingw的,這可以通過產生一個導入庫的可執行如下完成:

$ dlltool --export-all-symbols <program>.exe -l lib<program>.a -D <program>.exe 

-l參數指定的庫的文件名被創建,並且-D參數指定的Dllname (這是重要的,這是等於程序名稱)。爲了編譯dll,您需要通過將-l<program>添加到鏈接器標誌來鏈接到導入庫。

如果要限制輸出符號,你可以首先生成一個DEFS文件,對其進行編輯,然後生成從DEFS文件導入庫:

$ dlltool --export-all-symbols <program>.exe -z <program>.defs 
$ vi <program>.defs # Edit the list of exported symbols 
$ dlltool -d <program>.defs -l lib<program>.a -D <program>.exe 

注:的dlltool的名字可能取決於mingw環境(即Fedora上的i686-w64-mingw32-dlltool用於交叉編譯到i686窗口)。

0

我有同樣的問題 - 一個專有的應用程序,A.EXE,我想建立一個插件,p.dll

一個員額建議:

$ dlltool --export-all-symbols a.exe -z a.defs 
dlltool: a.exe: no symbols 

但有附帶A.EXEA.LIB文件。同樣,沒有[實用]出口額:

$ dlltool --export-all-symbols a.lib -z a.defs 

$ cat a.defs 
; dlltool --export-all-symbols -z a.defs q.lib 
EXPORTS 
    _NULL_IMPORT_DESCRIPTOR @ 1 DATA 
    _IMPORT_DESCRIPTOR_a @ 2 DATA 

[又見Building a dll with a gcc using a library file (.a) converted from import library (.lib)

最終,MinGW的郵件列表上找到一個提示,納米是我的解決方案:

$ echo EXPORTS >a.def 
$ nm -p a.lib |egrep 'T _' |sed 's/0* T _//' >>a.def 

一旦你有這個.def文件,很容易:

$ #generate liba.a that has the callbacks for the symbols in *a.exe* (what a.lib has, too) 
$ dlltool -v -l liba.a -d a.def 

$ #build my plugin, linking to liba.a 
$ gcc -shared p.c -L. -la -o p.dll 
相關問題