【问题标题】:x86 AMD64 DLL issue - Visual Studio 2005?x86 AMD64 DLL 问题 - Visual Studio 2005?
【发布时间】:2010-08-16 16:39:28
【问题描述】:

我收到一条错误消息,提示“应用程序无法正确启动 (0xc000007b)。单击确定关闭应用程序。”当我尝试运行使用 Visual Studio 2005 编译的程序时。

当我在这个可执行文件上运行“依赖”的 Windows 程序时,我看到了大量的 DLL,它们被列为“x86”dll。这些似乎都是 OS dll(位于 c:\windows\system32 目录中)。 “取决于”在描述架构的地方将它们列为红色,因为我正在制作 AMD64 二进制文件。一些 DLL(我从源代码编译的 QT dll)被列为 AMD64。

我尝试在“c:\windows\system32”之前将“c:\windows\SysWOW64”添加到我的路径并重建我的应用程序。在我看来,这就像这些 DLL 的 64 位版本所在的位置。这仍然会收到相同的失败消息。我的项目设置为构建为 x64 项目。在我的项目 -> 属性 -> 链接器 -> 高级 -> 目标机器下,我尝试了“MachineX64”和“未设置”。当我尝试运行我的可执行文件时,这两个设置都会在运行时产生相同的错误消息。

我对在 windows 环境中构建软件不是很了解。我的大部分经验来自 Linux。对我来说,这似乎是一个 DLL 架构问题,但我不确定。谷歌搜索这条错误消息并没有为我提供太多有用的信息。提供的任何帮助将不胜感激。我刚开始一份新工作,在实际运行我们的代码时似乎遇到了很多很多问题......

非常感谢您花时间阅读我的问题,

-布莱恩·J·斯蒂纳尔-

首先,非常感谢您向我提供反馈。

'set' 为我提供了以下信息,我相信这些信息将有助于回答您的一些问题。由于我对 Windows 系统管理不是很熟悉,如果您认为我应该运行任何其他命令来为您提供更多有用的信息,请告诉我。我认为与“set”相关的输出如下:

LIBVERSION=win64

PROCESSOR_ARCHITECTURE=AMD64

PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 26 Stepping 5, GenuineIntel

PROCESSOR_LEVEL=6

PROCESSOR_REVISION=1a05

在我的系统属性下,我发现以下值有助于澄清我的情况:

Windows 7

处理器:Intel(R) Xeon(R) CPU W3530 @ 2.80GHz 2.79 GHz

系统类型:64位操作系统

我不完全确定我理解 x64 和 ia64 之间的区别,但据我了解,ia64 是针对我没有的安腾类处理器的。我相信我有一个 x64 处理器。这是根据阅读帖子上的

http://mikedimmick.blogspot.com/2006/03/whats-difference-between-x64-and-ia-64.html

至强处理器属于 x64 类别。我不确定我是否理解 AMD64 如何适应这一点。

我是否应该有要链接的 AMD64 DLL,如果我实际上有 Intel Xeon 芯片,我的程序是否应该列出 CPU 类型 AMD64?

再次感谢您的帮助,

-布莱恩·J·斯蒂纳尔-

【问题讨论】:

  • 根据平台SDK的err.exe,0xC000007b是STATUS_INVALID_IMAGE_FORMAT(或ERROR_INVALID_NAME)。所以是的,听起来像是一个架构问题。您肯定在 64 位 Windows 上运行?你不是在混淆 x64 和 ia64 吗?

标签: windows dll visual-studio-2005 linker


【解决方案1】:

SysWOW64 是 32 位 DLL 在 64 位系统上的位置。 ('WOW'是'Windows On Windows',例如64位windows上的32位windows DLLs,所以SysWOW64是'Sys'tem folder for Windows On Windows64)通常情况下,程序运行时操作会被Windows自动重定向到这里在 64 位安装上检测 32 位映像。

我同意 Rup - 听起来您的映像是为与您正在运行的架构不同的架构构建的。

【讨论】:

  • 您好,感谢您为我澄清 SysWOW64。我正在慢慢成为一名 Windows 程序员。您有什么建议可以确保我的图像(以及所有支持的 DLL)是为 Visual Studio 2005 中的正确体系结构构建的吗?我相信这是一个 DLL 问题,但我不确定。此外,我能够在发布模式下完美运行,但不能在调试模式下运行。这也让我相信其中一个调试 DLL 构建不正确。我的“解决方案”是将构建环境更改为虚拟机。显然,这不太理想。再次感谢您,我很感激。
  • 在构建调试时,您确定解决方案中的所有项目都没有将“x86”设置为架构吗?一切都应该作为您的目标架构或“任何 CPU”运行,没有混合。
  • 由于我指的是我的项目 (DLL) 之外的功能,我以后如何检查这个?我为我正在构建的所有东西的架构设置了 x64,但我所依赖的其他东西并不是以同样的方式构建的。我不知道检查这个的一般方法...谢谢!
  • 检查外部项目的来源。 dumpbin /headers 的标准输出包含有关目标硬件的信息;如果它将针对 64 位图像运行,那将 brobalby 说一些不同的东西。您可能会查看 Dependency Walker-wehn 我在 64 位 dll 上运行它,它清楚地表明了我的 32 位 XP 机器上的目标架构。
  • 谢谢戴夫。您对垃圾箱的评论很有帮助。我已经知道依赖walker;它也是一个很好的工具。
【解决方案2】:

有两个 DLL 不正确。这些是:

libifcoremdd.dll libmmdd.dll

我今天正在与一位同事一起解决这个问题,他从一个他认为很好的位置复制了它们。当我早些时候与另一位同事一起工作时,我们从不同的位置复制了它们,结果证明是不正确的。

另外,如果其他人也有类似的问题,

dumpbin /headers DLLName 

将提供有关您正在使用的 DLL 的大量有用信息。我不确定这些不同的 DLL 之间有什么区别(在检查它们之前,我覆盖了旧的)。如果我对这个问题做进一步的分析,我会在这里发布结果。我怀疑 DLL 是 x86 或 ia64,而不是我需要的 x64 DLL。

在 Windows 环境中打包和移动此类 DLL 的最佳解决方案是什么?将它们复制到我路径中的目录似乎不是最好的解决方案。

非常感谢大家!

-布莱恩·J·斯蒂纳尔-

brian-stinar.blogspot.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多