无法执行我的程序的 64 位版本

Posted

技术标签:

【中文标题】无法执行我的程序的 64 位版本【英文标题】:Can't execute 64 bit version of my program 【发布时间】:2014-10-15 09:24:40 【问题描述】:

我只是想构建现有程序的 64 位版本(带有一些依赖 DLL 的 EXE)。由于在 Linux 下它很容易(只需重新编译它),我很乐观它在 Windows 下可能会有点相似。可惜不是……

启动我新编译的 EXE 后,我收到一条错误消息

The application has failed to start because its side-by-side configuration is incorrect...

追踪它的原因,我做了一个 SxS 跟踪,显示以下错误消息:

ERROR: Two assemblies have the same assembly name with different version.
Assembly 1: C:\Windows\WinSxS\manifests\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_fa396087175ac9ac.manifest.
Assembly 2: INFO: Manifest found at C:\Windows\WinSxS\manifests\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_fa396087175ac9ac.manifest..

那么..这是什么意思?我该如何解决这个问题?为 x64 安装 VS2010-redistributable 包不是诀窍,这里安装程序抱怨已经安装了一个较新的版本...

Manifest 文件中提到了一些 X86...是这个原因吗?如果是:如何找出它仍然依赖于哪些 X(& DLL?

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity version="0.64.1.0" processorArchitecture="x86" name="Controls" type="win32">   </assemblyIdentity>
  <description>wxWindows application</description>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="amd64" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

【问题讨论】:

显示您的应用程序清单 David Heffernan:将其添加到原始帖子中 【参考方案1】:

您的应用程序清单指定了x86 架构,并有两个comctl32 条目。

您应该为 32 位版本指定 x86,为 64 位版本指定 amd64。你应该只列出一次comctl32。对于依赖程序集架构,您可以根据需要指定*,但我个人更喜欢明确。

【讨论】:

好的,我删除了对 comctl32.lib 的所有链接引用,但问题仍然存在... 这不是我说要做的。 David Heffernan:所有 DLL 和 EXE 都已经是 64 位版本了! David Heffernan:好的,那么这是一个更普遍的问题(可能是我的理解):我没有创建清单,VS2010 会自动为我做这件事(每次我都会覆盖它重建EXE)。 EXE 位于与清单完全不同的位置,因此我认为 Windows 将无法找到它。并且:我打算只部署 exe,没有任何清单……那么这有什么帮助呢? 清单链接到您的可执行文件。我敢肯定 VS 不会表现出来。它完全坏了。

以上是关于无法执行我的程序的 64 位版本的主要内容,如果未能解决你的问题,请参考以下文章

无法安装64位office,因为已有32位版本怎么办

mysql无法执行二进制文件可执行文件格式错误

vs2010指定的文件格式无法识别或为不支持的二进制

电脑显示你不能在64位文件上执行DEP属性怎么处理?

VMware12提示 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。

cmake 创建解决方案时未链接 64 位可执行文件