【问题标题】:How to resolve the module machine type 'X86' conflicts with target machine type 'x64' Visual Studio如何解决模块机器类型“X86”与目标机器类型“x64”Visual Studio 的冲突
【发布时间】:2015-10-14 06:15:40
【问题描述】:

我正在编译需要在 python 脚本中使用的 Openssl 库。我正在使用 Visual Studio 2015 开发人员命令提示符。我的机器是 Windows 7 64 位。

当我输入命令时:nmake -f ms\ntdll.mak

我得到这个错误:

tmp32dll\uplink.obj : fatal error LNK1112: module machine type 'X86' conflicts w
ith target machine type 'x64'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0
\VC\BIN\amd64_arm\link.EXE"' : return code '0x458'
Stop.

我搜索了几个类似问题的解决方案,建议从项目设置中更改项目平台。我没有VS项目。我运行所有这些命令只是为了编译 OpenSSL 库。我正在使用 VS 命令。

【问题讨论】:

标签: visual-studio visual-c++ visual-studio-2015


【解决方案1】:

我遇到了同样的问题 - 只是使用 VS2013。

我遇到了 2 种方法,它们可能对您的情况有帮助,也可能没有帮助:

第一种方法

(可能只适用于VS2013及以上版本)

打开“VS2015 x64 Native Tools 命令提示符”并在那里执行命令。

 Note:
 If you get the opposite message:
 module machine type 'x64' conflicts with target machine type 'x86' 
 then you should open the 'VS2015 x86 Native Tools Command Prompt' 

这两个工具都可以在文件夹下找到:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\Shortcuts

第二种方法

(可能仅与 VS2013 之前的版本相关)

在 VS2015 的开发人员命令提示符中,您可以通过运行以下命令来更改编译器目标平台

“C:\Program Files (x86)\Microsoft Visual Studio 15.0\VC\vcvarsall.bat x64”

"C:\Program Files (x86)\Microsoft Visual Studio [VS 版本]\VC\vcvarsall.bat [目标平台]"

对于 VS 2017

“C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat [目标平台]”

Note:
VS Version: 10.0|11.0|12.0|15.0|... 
Target Platform: x86|amd64|x64|arm|x86_arm|x86_amd64|amd64_x86|amd64_arm|amd64_x86
*leaving the target platform empty will default to x86

【讨论】:

  • 谢谢,启动 x86 32 位 Visual Studio shell 解决了我在 Windows 10 上编译 32 位 openssl 的问题。错误消息是:crypto\aes\aes_cfb.obj : fatal error LNK1112: module machine类型“x64”与目标机器类型“X86”冲突
  • 对于 VS 2017,vcvarsall.bat 可以在“C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build”中找到
  • @TrevorSeward 将您的评论添加到答案中,谢谢!
  • 在从here 安装 Microsoft Visual C++ Compiler for Python 后,我遇到了同样的问题。我发现我的 vcvarsall.bat 通常在这里找到(C:\Users\$User\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0)并使用输入“x64”和 viola 运行它!现在一切都适用于 64 位。
  • 非常感谢 VS 2017 的解释!
【解决方案2】:

此错误意味着 tmp32dll\uplink.obj 是 32 位二进制文​​件,而链接器预期它是 64 位,因为它的目标是 64 位。

看来您需要将其重新编译为 64 位,或者只执行全部重建(或删除所有 *.obj 甚至整个二进制输出目录)

如果构建过程中断,然后您更改目标平台,然后以增量方式重复构建过程,就会发生这种情况。 32 位不与 64 位混合,所以要么完全是一种方式,要么另一种方式。

【讨论】:

  • 感谢您的帮助。您能否帮我“如何”:1)“将 uplink.obj 重新编译为 64 位,或者”2)“只需执行全部重建(或删除所有 *.obj 甚至整个二进制输出目录) )”。我是这样的新手。
  • 看起来 nmake /b 是重建的选项。制作/?将向您展示所有选项。但如果我是你,我会尝试下载现有的 openssl 二进制发行版,而不是尝试自己构建它。
  • 我必须自己构建它,因为我将替换一些文件并重新编译。二进制文件不能满足我的需要。
  • 能否请您指出如何执行全部重建或删除二进制输出目录?二进制输出目录应该在哪里?
  • 我不知道如何让 openssl 进行清理,但我手动删除了所有 *.obj 文件,它似乎可以解决问题。
【解决方案3】:

出现此错误是因为构建中的特定组件被编译为 x86 二进制而不是 x64(目标机器的体系结构) - 基本上你给链接器一个方形拼图并告诉它适合圆形洞。

在你的情况下:

tmp32dll\uplink.obj : fatal error LNK1112: module machine type 'X86' conflicts w
ith target machine type 'x64'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0
\VC\BIN\amd64_arm\link.EXE"' : return code '0x458'
Stop.

您查看导致错误的 obj 文件的名称:uplink.obj,因此您查看 uplink.cpp(或 uplink.asm 或 uplink.whatever)并检查它是如何编译的。通常所有这些东西在 VS 中都是自动化的,但有时开发人员会添加一些特殊的构建步骤。检查自定义、构建前和构建后事件以查看是否使用 x86 工具来组装它。

在我的例子中,我尝试使用 Visual Studio 8 在 x64 中编译 7zip,并且除了在 x86 中编译并破坏构建过程的程序集宏 (asm) 之外的所有内容都在编译。通过查看 asm 的属性表,我发现 VS 试图使用 ml.exe 而不是 ml64.exe 来编译它们。在我的情况下,将调用更改为 ml64.exe 以消除此错误(我还必须通过摆脱所有 x86 代码将 asm 文件修改为 64 位,但这是另一回事)。

【讨论】:

    【解决方案4】:

    如果在 VS2019 中使用 cl,请确保使用正确的 VS 原生工具进行编译

    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat"
    
    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat"
    

    【讨论】:

      【解决方案5】:

      我使用 VS 命令提示符中的 corflags 来更改机器类型

      https://docs.microsoft.com/en-us/dotnet/framework/tools/corflags-exe-corflags-conversion-tool

      更改机器类型: corflags d:\abc.exe /32BITREQ- Microsoft (R) .NET Framework CorFlags 转换工具。版本 4.6.1055.0 版权所有 (c) 微软公司。保留所有权利。

      使用 corflags 进行验证:

      C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>corflags d:\abc.exe Microsoft (R) .NET Framework CorFlags 转换工具。版本 4.6.1055.0 版权所有 (c) 微软公司。保留所有权利。

      版本:v4.0.30319 CLR 标头:2.5 聚乙烯:PE32 CorFlags:0x1 仅 : 1 32BITREQ : 0 32BITPREF:0 签名:0

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多