2011-10-12 102 views
3

我正在鏈接一個DLL與其他DLL的一些依賴關係。 我在連接我的項目的64位版本時遇到了問題。對於32位版本,只要我使用mingw32就可以。但是,當我切換到相關DLL和MinGW-W64的64位版本,它講述了以下內容:鏈接64位DLL MINGW

c:/.../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible .\lib\native/libblabla.dll when searching for -llibblabla 

其中「libblabla」是我依賴於庫。我確定它是64位版本,應該兼容。這是明明的錯誤嗎?

此外,我試圖鏈接使用lib文件,但提供的lib也被認爲是不兼容的,並由dlltool生成的一個沒有導入表生成!

我完全堅持這一點。 謝謝。

+0

你有沒有找到解決你的問題?我得到類似的錯誤,只有我的逆轉...一切適用於64位dll和失敗與32位。使用nm -t時,我會得到相同的基數錯誤。 – Jason

回答

2

首先,獲得一些可能的誤解的方式進行:

  1. GCC/LD可以鏈接到(正常出口)32位的DLL和.lib/.a進口和靜態庫。
  2. GCC/ld應該能夠鏈接到一個正確導出的64位DLL或.a導入或靜態庫,但從來沒有一個64位的.lib文件。
  3. 你不是建立/鏈接-m32,是嗎?

通過「正確導出」我的意思是dumpbin /exportsnm -t顯示在DLL上運行時導出的符號。

你應該嘗試什麼:

  1. 構建的通過GCC的一個電話,沒有任何直接調用的binutils。選項-shared -o name.dll -Wl,--import-lib, libname.dll.a應該讓你開始。

  2. 使用的MinGW-W64的gendef(這是在他們的SVN /來源mingw-w64-tools目錄)生成一個DEF文件,你可以創建一個導入庫。

如果這些在導入庫中不生成符號,則不會導出任何符號。雖然這將是令人驚訝的錯誤消息說,DLL是32位。 MSYS/Cygwin的dll上的命令file返回什麼?

+0

感謝您的回答。我正在使用dlltool爲外部庫生成.def文件。它生成空文件(我不計算'EXPORT'字)。我可以採取哪些措施來改變這一點?另外,我知道外部庫是用Visual Studio構建的,這可能是一個原因嗎? –

+1

另外,納米:libblabla.dll:當執行'nm -t libblabla.dll'時出現無效的基數 –

+0

Vladimir:「無效基數」錯誤很奇怪,您是否使用爲x86_64-w64-mingw32構建的nm?在32位和64位DLL上嘗試使用MSVC的「dumpbin/exports」。如果dlltool返回一個空的def文件,則不會導出任何符號。導出的符號需要在構建DLL時通過'__cdecl(dllexport)'標記,而在包含來自客戶端應用程序的頭時需要通過'__cdecl(dllexport)'標記。不管比特率如何,這都應該是真的。 – rubenvb