连接64位dll mingw

3

我正在链接一个带有其他dll依赖项的dll。 我在链接64位版本的项目时遇到了麻烦。当我使用mingw32时,32位版本一切正常。但是当我切换到64位版本的依赖dll和mingw-w64时,它会显示以下内容:

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

'libblabla'是我所依赖的库,我非常确定它是64位版本并且应该是兼容的。这是mingw的一个bug吗?

此外,我尝试使用lib文件进行链接,但提供的lib也被认为是不兼容的,而由dlltool生成的lib文件没有生成导入表!

我完全陷入了困境。 谢谢。


你是否曾经找到解决问题的方法?我遇到了类似的错误,只不过我的情况是相反的...一切都适用于64位的dll,但在32位的情况下则失败了。当我使用nm -t时,我也会遇到相同的基数错误。 - Jason
1个回答

2
首先,为了消除一些可能的误解:
1. GCC/ld 可链接到(正确导出的)32 位 DLL 和 .lib/.a 导入库和静态库。 2. GCC/ld 应该能够链接到一个正确导出的 64 位 DLL 或 .a 导入库或静态库,但永远不会是 64 位 .lib 文件。 3. 你没有使用 -m32 构建或链接,对吗?
“正确导出”指的是在运行 dumpbin /exports 或 nm -t 命令时,DLL 中显示出已导出的符号。
你应该尝试以下方法:
1. 通过对 gcc 的调用进行构建,而不是对 binutils 进行任何直接调用。选项 -shared -o name.dll -Wl,--import-lib, libname.dll.a 可以帮助你入门。 2. 使用 MinGW-w64 的 gendef(它在他们的 SVN/sources 目录下)生成一个 .def 文件,你可以创建一个导入库。 如果这些在导入库中没有产生任何符号,那么你没有导出任何符号。尽管错误消息说 dll 是32位的,但这将令人惊讶。MSYS/Cygwin 上的 file 命令返回什么?

谢谢您的回答。我正在使用dlltool为外部库生成.def文件。它生成了一个空文件(我不算'EXPORT'这个词)。我应该采取哪些步骤来改变这种情况?此外,我知道外部库是使用Visual Studio构建的,这可能是原因吗? - Vladimir Ivanov
1
另外,nm:libblabla.dll:在执行“nm -t libblabla.dll”时无效的基数。 - Vladimir Ivanov
弗拉基米尔: “无效的基数”错误很奇怪,您是否使用了为x86_64-w64-mingw32构建的nm?请在32位和64位DLL上尝试MSVC的dumpbin /exports。如果dlltool返回一个空的def文件,则没有导出符号。导出的符号需要在构建DLL时通过__cdecl(dllexport)标记,并在从客户端应用程序包含头文件时作为__cdecl(dllexport)标记。这应该是无论位数如何都是正确的。 - rubenvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接