2011-08-15 88 views
5

我有一個有開發工具的硬件(xray傳感器)。但afaiu這些都建於msvc。所以我有一個.lib文件和.dll文件。如果我將這個lib文件包含到我的項目中(我正在使用qt),並將dll文件放到exe文件夾中並使用MSVC-Release選項進行編譯。但是當我嘗試使用mingw-Release選項進行編譯時。它失敗。在mingw中使用msvc lib

未定義的參考`小鬼 __ZN6IDcDrv6CreateEPKci「

未定義的參考`小鬼 __ZN6IDcDrv14GetDeviceCountEv」

你可以點一些出路,這樣我就可以使用這些庫。並使用MinGW的編譯器的dll文件

PS: 我嘗試和失敗 IMPDEF dclibsn.dll> dclib.def

dlltool -dllname dclibsn.dll --def dclib.def --output-lib的libdclibsn.a

,這是我的DEF文件看起來像

LIBRARY "dclibsn.dll" 
EXPORTS 
[email protected]@[email protected]@@Z 
[email protected]@[email protected][email protected][email protected][email protected]@[email protected]@@@@[email protected]@@Z 
[email protected]@[email protected]@@Z 
[email protected]@[email protected] 
[email protected]@[email protected] 
[email protected]@[email protected]@@Z 
[email protected]@[email protected]@@Z 
[email protected]@@[email protected] 
[email protected]@@AAE_NXZ 
[email protected]@@[email protected] 
[email protected]@@[email protected] 
[email protected]@@[email protected]@[email protected] 

注意在此文件中的最後一項(創建)。我試圖在程序中調用這個,我也得到

(.text+0x1ad): undefined reference to `_imp___ZN6IDcDrv6CreateEPKci' 

,如果我更換線?創建@ IDcDrv @@ SAPAVDcDrv @@ PBDH @ Z

小鬼 __ZN6IDcDrv6CreateEPKci彙編,但給人的錯誤。

The procedure entry point _ZN6IDcDrv6CreateEPKci could not be located in the dynamic link library dclibsn.DLL. 

回答

0

我當然對這個問題的專家,但我始終認爲,使用MinGW建項目無法使用任何DLL或庫從MSVC項目,因爲它們與不同的編譯器編譯。

+0

這是真的。所以我試圖找到一種方法將這個dll和lib導出爲.a格式,以便我可以將它與mingw鏈接起來。如果我是正確的dll文件可以用於.lib和.a文件。 – ardavar

+0

非常酷。我會密切關注這一點,看看你是否找到了解決辦法,因爲我一直很好奇這樣做。 – NeilMonday

1

看到這個: How to use libraries compiled with MingW in MSVC?

我的意思是,圍繞着爲extern 「C」 塊的#include。 因爲使用extern「C」會指示編譯器該函數正在使用C鏈接,而不是C++,這將阻止它對函數執行名稱修改。

我認爲名字混搭導致鏈接問題。 不知道這將有助於自動使用DLL或不。希望它會。 因爲我需要在MSVC 2005中編寫一個基於CUDA的dll,並在mingw中使用它。

希望得到這個幫助。 : - ?

0

這裏有一個簡單的問題:對於MS編譯器和GCC,名稱修改方案(即從可能重載的名稱的C++函數到僅通過名稱標識函數的字符串的映射)是不同的。因此,函數名稱是不同的,MingW搜索自己的錯位名稱格式(_ZN6IDcDrv6CreateEPKci),並找不到微軟錯位的名稱( [email protected]@@[email protected]@[email protected])。

現在,如果這兩個庫是真正使用C++的功能,這是更好了。假設你將C++字符串從庫中傳遞到你的程序中,並且返回 - 絕對不能保證字符串的MS實現與GNU實現是二進制兼容的,所以你最終可能會遇到令人討厭的錯誤。但是,如果這些函數的接口是C兼容的(可以用POD術語表示),則可以在extern "C"塊中聲明這些函數,從而禁用名稱修改。看來你正在構建的lib的開發者沒有這樣做。如果這是不必要的(對不起,我不能將MSVC名稱去除爲函數簽名,所以真的不能說明),您應該向庫提交一個錯誤並讓它們聲明接口或儘可能使用extern "C"作爲大部分。如果這是不可能的,在MSVC中編寫一個包裝程序,調用它們的函數並在extern "C"內聲明它自己的函數。

0

正如@thithon所指出的那樣,您的問題是C名稱損壞。正如他所建議的,你應該做外部的「C」來避免這種情況。

入口點錯誤是因爲你可能在你的dll中沒有main()。只要添加一個(即使它是空的,它並不重要),並且該錯誤將消失。