5

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


进一步更新:最终问题出在一个 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”、系统文件夹和清单处理。只有 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"

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

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

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

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

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

    1. VS2010
    2. VS2010 SP1
    3. .NET 框架 4.5
    4. 视窗 8 SDK
    5. Qt 库 4.8.4
    6. QtCreator 2.7.1

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

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

4

1 回答 1

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”、系统文件夹和清单处理。只有 32 位版本的 Dependency Walker 才能访问这个 32 位环境,这是准确处理一个 32 位模块所需要的。同样地,

于 2014-04-23T21:12:33.933 回答