Visual studio 如何解析模块机器类型';X86和x27;与目标机器类型'冲突;x64和x27;Visual Studio

Visual studio 如何解析模块机器类型';X86和x27;与目标机器类型'冲突;x64和x27;Visual Studio,visual-studio,visual-c++,visual-studio-2015,Visual Studio,Visual C++,Visual Studio 2015,我正在编译我需要在python脚本中使用的Openssl库。我正在使用Visual Studio 2015 Developer命令提示符。我的机器是64位Windows 7 键入命令时:nmake-f ms\ntdll.mak 我得到这个错误: tmp32dll\uplink.obj : fatal error LNK1112: module machine type 'X86' conflicts w ith target machine type 'x64' NMAKE : fatal er

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

键入命令时:
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命令

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

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


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

我遇到了同样的问题——只是VS2013

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

第一种方法

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

打开“VS2015 x64本机工具命令提示符”,并在此处执行命令

 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' 
这两种工具都可以在文件夹下找到:

第二种方法

(可能仅适用于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[目标平台]”


出现此错误是因为构建中的特定组件被编译为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工具来组装它


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

如果在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"

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

更改机器类型: cord:\abc.exe/32BITREQ- Microsoft(R).NET框架转换工具。版本4.6.1055.0 版权所有(c)微软公司。版权所有

使用corflags进行验证:

C:\Program Files(x86)\Microsoft Visual Studio\2017\Enterprise>Cord:\abc.exe Microsoft(R).NET框架转换工具。版本4.6.1055.0 版权所有(c)微软公司。版权所有

版本:v4.0.30319 CLR标头:2.5 PE:PE32 CorFlags:0x1 I:1 32BITREQ:0 32BITPREF:0
签名:0

感谢您的帮助。你能帮我“如何”吗:1)“将uplink.obj重新编译为64位,或“2”只需执行全部重建(或删除全部*.obj,甚至整个二进制输出目录)”。我是这方面的新手。看起来nmake/b是重建的选项。nmake/?将显示所有选项。但如果我是你,我会尝试下载现有的openssl二进制发行版,而不是自己构建。我必须自己构建它,因为我会替换一些文件并重新编译。二进制文件不能满足我的需要。请指出我如何执行“全部重建”或删除二进制输出目录?二进制输出目录应该在哪里?我不知道如何让openssl做一个清理,但我手动删除了所有的*.obj文件,它似乎做到了。我遇到了同样的问题,并通过选择“VS2015 x64本机工具命令提示符”而不是“VS2015的开发人员命令提示符”解决了这个问题。在干净版本的源代码上尝试它(没有以前的生成输出)。可能重复感谢,启动x86 32位Visual Studio shell解决了我在Windows 10上编译32位openssl的问题。错误消息是:crypto\aes\aes\u cfb.obj:致命错误LNK1112:模块计算机类型“x64”与VS 2017的目标计算机类型“X86”冲突,vcvarsall.bat可在“C:\Program Files(X86)\Microsoft Visual Studio\2017\Enterprise\VC\Assistant\Build”@TrevorSeward中找到,请在答案中添加您的注释,谢谢!在安装了微软Python的Visual C++编译器之后,我遇到了同样的问题。我发现我的VCVasal.BAT通常在这里找到(C:\\\\用户\\$AuthDe\AppDATAB\Studio \公用\微软\ Visual C++,用于Python 9),并运行它与输入“X64”和中提琴!现在,64位的一切都很好。非常感谢VS 2017的解释!
"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"