這已經在許多地方的部分討論過,但它仍然不適合我。在C++中使用delphi庫
我從Delphi源,其中出口下兩個名字一個函數編譯一個dll,檢查使用
>> dumpbin /EXPORTS MyLibrary.dll
我得到以下輸出的dll:
...
17 3 00070A88 MyFunction
...
46 24 00070A88 [email protected]
...
,所以我創建了一個文件稱爲MyLibrary.def,其內容如下:
EXPORTS
MyFunction
[email protected]
並生成一個導入庫使用
>> lib /def:MyLibrary.def /OUT:MyLibrary.lib /MACHINE:x86
檢查新的LIB文件與DUMPBIN我看到以下內容:
...
_MyFunction
...
[email protected]
...
於是莫名其妙的lib應用程序函數名前面加一個下劃線。 (爲什麼?)
然後我嘗試在C++程序使用此功能,與Microsoft Visual Studio C++ 2010速成編譯(使用LIB文件):
// MyLibrary.h
# define DllImport(Type) __declspec (dllimport) Type __stdcall
extern "C" DllImport(void)MyFunction(...);
// main.cpp
#import "MyLibrary.h"
...
MyFunction(....);
...
現在,這應該工作,至於我能找到,但我得到下面的連接錯誤:
... error LNK2001: Unresolved external sympol "[email protected]".
我不明白爲什麼這個出錯(我不明白真的整件事是如何工作的?),但我嘗試了兩種更多的東西。
- 改名我在MyLibrary.h功能和main.h從MyFunction的到_MyFunction
- 結果:它的作品!但爲什麼?我不想依賴這個,因爲有些東西顯然是錯的。
- 更名爲我的函數返回的MyFunction並刪除在DEF-文件下劃線,再次生成的lib文件,並試圖編譯
- 結果:編譯成功,但在啓動程序時,我得到
MyApp - Entry Point Not Found
---------------------------
The procedure entry point [email protected] could not be located
in the dynamic link library MyLibrary.dll.
我認爲一個人需要的lib工具和連接器的內部工作有了更深的瞭解,但我到目前爲止找不到任何有關這方面的信息。
+1這是非常好的。我們的產品附帶一個用Delphi編寫的DLL。我們的許多客戶都希望從C++中調用它,因此需要一個.lib文件。我們手動創建.h文件,然後使用perl腳本來執行本答案中描述的階段。這是做這件事的最好方式。 –
我以爲這就是implib的意思,@David。 –
這是一個Embarcadero工具(如果我們引用相同的東西),因此會生成Borland OMF格式的lib文件。我不相信它會生成所有其他編譯器供應商使用的COFF文件。還是近來有所改變?無論如何,如果你認爲implib是答案,爲什麼你沒有在你的答案中提到這一點? –