2011-10-12 103 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