为什么QtCreator/MSVC将64位系统DLL链接到我的32位应用程序?

Ste*_*ows 5 windows qmake qt-creator 32bit-64bit visual-c++

更新:这基本上都是虚假的.事实证明,运行应用程序的机器上的Depends.exe版本是32位版本.修复后,两台机器都将系统DLL显示为64位,因此这不是问题的根源.不确定为什么依赖在32位exe中以这种方式显示它们.


进一步更新:最终问题是一个64位DLL.使用正确版本的Dependency Walker后,这更容易找到.选择32对64位版本并不基于您运行的平台.来自FAQ:

Dependency Walker适用于任何32位或64位Windows模块.有32位和64位版本的Dependency Walker.所有版本都支持或打开32位和64位模块.但是,使用32位Dependency Walker处理32位模块和使用64位Dependency Walker处理64位模块有很大的优势.在64位版本的Windows上运行时尤其如此,它允许执行32位和64位程序.64位Windows上的32位子系统(称为"WOW64")具有自己的私有注册表,"AppPaths","KnownDlls",系统文件夹和清单处理.只有32位版本的Dependency Walker才能访问这个32位环境,这是准确处理32位模块所必需的.同样,


我有一个应用程序可以在一台机器上正确构建而在另一台机器上不正确.两者都是通过BootCamp运行Windows 7的MacBook Pro.它们是通过QtCreator构建的,VS2010是编译/链接工具.

在机器A上,它编译和链接没有任何报告的错误.但是,运行时失败并出现0xc000007b错误(STATUS_INVALID_IMAGE_FORMAT).Depends.exe确认exe是32位exe,但所有Windows DLL(advapi32.dll等)都链接为64位DLL.似乎这将是链接时间错误,但显然不是.

在机器B上,一切都编译并正确运行.Depends.exe确认exe和所有链接的DLL都是32位.

我的Qt项目配置如下:

qmake: qmake.exe PROJECT.pro -r -spec win32-msvc2010 "CONFIG+=declarative_debug"
Run Code Online (Sandbox Code Playgroud)

我相信该-spec win32-msvc2010部分足以指定32位构建.

项目文件显式链接到位于以下位置的Windows导入lib文件: C:/ Program Files(x86)/ Microsoft SDKs/Windows/v7.0A/Lib 我已经确认这些是32位导入库.项目文件中的显式LIB + =行调用此路径.如果从项目文件中删除此行,则链接仍会成功.所以我不确定在这种情况下如何指定Windows系统导入库的位置.

我用dumpbin验证了导入.libs被标记为32位或64位.我们使用32个import libs指定位置.

因为一台机器工作而另一台机器不工作,我认为问题是机器配置问题.因此,我从机器A中删除并重新安装了MS工具:

  • 卸载了VS2010,Windows 8 SDK,.NET Framework 4.5,QT库和QtCreator.
  • 按以下顺序重新安装以上所有内容:

    1. VS2010
    2. VS2010 SP1
    3. .NET Framework 4.5
    4. Windows 8 SDK
    5. Qt图书馆4.8.4
    6. QtCreator 2.7.1

我仍然得到一个32位exe链接到64位DLL.

什么可能导致奇怪的链接?和/或如何更准确地确定它认为它应该链接到64位DLL的原因?

Mar*_* Ba 1

它不是。

从问题文本中回答:

这本质上都是假的。事实证明,运行应用程序的计算机上的 Depends.exe 版本是 32 位版本。修复该问题后,两台机器都将系统 DLL 显示为 64 位,因此这不是问题的根源。

最终问题出在 64 位 DLL 上。使用正确版本的 Dependency Walker 后更容易找到这一点。选择 32 位版本还是 64 位版本并不取决于您所运行的平台。来自常见问题解答

Dependency Walker 可与任何 32 位或 64 位 Windows 模块配合使用。Dependency Walker 有 32 位和 64 位版本。所有版本都能够打开 32 位和 64 位模块。但是,使用 32 位 Dependency Walker 处理 32 位模块和使用 64 位 Dependency Walker 处理 64 位模块有很大的优点。在 64 位版本的 Windows 上运行时尤其如此,它允许执行 32 位和 64 位程序。64 位 Windows 上的 32 位子系统(称为“WOW64”)拥有自己的私有注册表、“AppPaths”、“KnownDlls”、系统文件夹和清单处理。只有 Dependency Walker 的 32 位版本才能访问此 32 位环境,这是准确处理 32 位模块所必需的。同样,只有 Dependency Walker 的 64 位版本才能完全访问 64 位环境,因此应始终使用它来处理 64 位模块。