致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突

时间:2010-08-25 07:36:09

标签: visual-c++ visual-c++-2008

我正在使用CUDA(VC ++,Visual studio 2008sp1)来调试FEM程序。由于cuda的不足,该程序只能在Win32平台上运行。我认为链接的库文件都是在x86平台上编译的,但是当我编译它时,我收到错误消息“致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突”。

我试图将平台转换为x64,但它没有用。请告诉我:什么是“模块机器类型”什么是“目标机器类型”?我怎样才能克服它?

28 个答案:

答案 0 :(得分:228)

我写了一篇关于这个的blog条目,因为我遇到了这个令人抓狂的问题,最后把我的系统拉回到正常工作状态。

这些是要检查的事项,按此顺序:

  1. 在以下位置检查链接器设置中的属性选项:属性>配置属性>链接器>高级>目标机器。如果您的目标是64位版本,请选择MachineX64;如果您正在构建32位版本,请选择MachineX86。

  2. 选择构建>配置管理器来自visual studio的主菜单。确保您的项目具有指定的正确平台。可以将IDE设置为构建x64,但解决方案中的单个项目可以设置为目标win32。所以是的,视觉工作室留下了很多绳索来吊死自己,但这就是生活。

  3. 检查您的库文件,他们确实是平台类型的目标。这可以通过使用visual studio VC \ bin目录中的dumpbin.exe来使用。使用-headers选项转储所有函数。查找每个功能的机器条目。它应该包括x64,如果它是64位构建。

  4. 在visual studio中,选择工具>主菜单中的选项。选择项目和解决方案> VC ++目录。从Platform下拉列表中选择x64。确保第一个条目是: $(VCInstallDir)\ bin \ x86_amd64 ,然后是 $(VCInstallDir)\ bin

  5. 一旦我做了第4步,一切都为我工作了。问题是我在所有项目中都遇到了这个问题,我想要编译为64位目标。

答案 1 :(得分:123)

除了 C Johnson 列表,我还要添加以下内容:

签入Visual Studio:
项目属性 - >配置属性 - >链接器 - >命令行。

“其他选项”不应包含/machine:X86

我有这样的密钥,由CMake输出生成:CMake生成x86项目,然后我在Visual Studio 2010中通过Configuration Manager添加了x64平台 - 除了链接器命令行之外,所有内容都可以用于新平台,

分别指定/machine:X86

答案 2 :(得分:53)

当我尝试将X64版本添加到从VS2003转换的项目时,我在VS2008中遇到了同样的问题。

我查看了在Google上搜索此错误时发现的所有内容(目标计算机,VC ++目录,DUMPBIN ....),一切正常。

最后,我创建了一个新的测试项目并进行了相同的更改,似乎有效。

在vcproj文件之间进行差异显示问题....

我的转换项目已将/ MACHINE:i386设置为Linker->命令行下的附加选项集。因此,有两个/ MACHINE选项设置(x64和i386),另外一个选择优先。

在Linker-> Advanced-> Target Machine下删除并正确设置它会使问题消失。

答案 3 :(得分:21)

所有项目设置似乎都很完美,但我仍然遇到错误。查看.vcxproj文件并搜索" x86"透露了问题:

<Lib>
  <AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>

快速搜索/替换所有出现事件(十个单独的文件设置)解决了问题。

答案 4 :(得分:13)

由于问题是由于编译和目标机器规格不同(x86&amp; x64) 请按照以下步骤操作:

  1. 打开要配置的C ++项目。
  2. 选择Configuration Manager按钮以打开Configuration Manager对话框。
  3. 在Active Solution Platform下拉列表中,选择打开New Solution Platform对话框的选项。
  4. 在“类型”或“选择新平台”下拉列表中,选择一个64位平台。
  5. 它解决了我的问题。

答案 5 :(得分:12)

当您链接x86(这是目标机器类型)时,您可能有一个针对x64(。模块机器类型)的.OBJ或.LIB文件。

在.OBJ文件上使用DUMPBIN / HEADERS并检查FILE HEADER VALUES块中的机器条目。

答案 6 :(得分:6)

在Visual Studio 2012 +/-中,&#34;配置属性&#39; .Linker。&#34;命令行&#34;的属性页。包含一个标有&#34;附加选项&#34;的框。如果您正在构建x64,请确保该框不包含/ MACHINE:I386。我的项目确实存在并产生了错误。

答案 7 :(得分:4)

我在构建QT时遇到了这个问题。我在某处阅读的说明建议我使用VS命令提示符配置nmake。

我选择了x64命令提示符并执行了配置而没有太多麻烦。当我尝试nmake时,它给出了这个错误。

我认为有些组件是为32位预构建的。该错误甚至报告了为x86构建的模块。

我使用32位默认VS命令提示符,但它有效。

答案 8 :(得分:3)

在Visual Studio 2013中,

1)检查项目属性页/配置属性/链接器/所有选项,并更正所有未命中配置的机器和目录。

2)检查项目属性页/配置属性/链接器/输入并更正所有未命中配置的目录。

参见1)的例子

答案 9 :(得分:1)

如果您的解决方案有lib项目,请检查Property-&gt; Librarian-&gt; General

中的Target Machine属性

答案 10 :(得分:1)

除了Jhonson的列表,还要检查库的文件夹

在visual studio中,选择工具&gt;主菜单中的选项。选择项目和解决方案&gt; VC ++目录。从平台下拉列表中选择x64。

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;

答案 11 :(得分:1)

"project property - CUDA Runtime API - GPU - NVCC Compilation Type"

设置64位编译选项-m64 -cubin

提示是在编译日志中。 像这样:

nvcc.exe ~~~~~~ -machine 32 -ccbin ~~~~~

"-machine 32"是问题。

首先设置64位编译选项, 接下来重新设置混合编译选项。 那么你可以看到成功。

答案 12 :(得分:1)

我的目标是使用C语言的x64 Windows 10文本模式DOSBox应用程序。 使用“ Visual Studio 2019社区”通过DOS提示符“ nmake -f makefile”进行编译。 错误类似,但相反:

fatal error LNK1112: module machine type 'x32' conflicts with target machine type 'X64'

可以在另一台计算机上通过VC ++ 2010进行编译。但是在“ Visual Studio 2019社区”的这台计算机上失败了。因此我的设置正确,以上所有答案均无效。

我想与您分享解决方案是像这样的make.bat:

call "c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" 
nmake -f makefile

您会发现还有很多其他vcvarsxxxx.bat,只有这一个字。

答案 13 :(得分:1)

今天发生这种情况是因为我在x86模式下添加了一个库目录,并且意外地删除了继承的目录,使它们硬编码。 然后切换到x64后,我的VC ++目录仍然显示:

“...; $(VC_LibraryPath_x86); $(WindowsSDK_LibraryPath_x86);”

而不是_x64。

答案 14 :(得分:1)

我正在使用CMake&amp;然后添加了win32配置。属性页显示 x86 但实际上在文本编辑器中打开vcxproj文件时它是x64!手动更改为x86解决了这个问题。

答案 15 :(得分:1)

这是一个非常令人沮丧和恼人的问题但是一旦你理解了它,它就非常简单了:你有一些元素在构建一个架构类型(在你的情况下是x64)事实上,它是另一种类型的目标(比如x86)。

您可以通过查看导致崩溃的obj文件并开始在那里查找问题来剖析问题的根源。每个obj都有一个源代码模拟:在cpp,c,asm等中。可能存在使用错误工具的特殊构建事件。在属性表中检查。

在查看C Johnson要做的事情之前,我先先看一下。

答案 16 :(得分:1)

vcxproj文件可能包含'MACHINE:i386' 使用编辑器编辑vcxproj文件。删除它!

答案 17 :(得分:1)

我通过在Win Studio 2013中将Win32更改为* 64来解决了这个问题。

答案 18 :(得分:0)

我已经按照以下步骤为自己解决了这个问题。

首先,我回答了这个问题的其他答案,只是得出所有项目设置都是正确的结论。

然后,我用编辑器检查了.vcxproj文件,并注意到两个(调试和发行)x64配置的属性未指定,而Win32配置都包含了 MachineX86

但是,我已经从Visual Studio的“属性”>“配置属性”>“链接器”>“高级”>“目标计算机”中进行了验证,证实x64配置表示MachineX64(/ MACHINE:X64)。

因此,我编辑了.vcxproj文件,在两个x64配置中包括了 MachineX64 。回到Visual Studio项目属性对话框,我注意到MachineX64(/ MACHINE:X64)设置与以前一样,只是现在它以粗体显示(显然意味着该值不是默认值)。

我重建了,并且成功了。

答案 19 :(得分:0)

上面有很多好的建议。

如果您尝试在x86 Win32中进行构建,则:

请确保您在程序文件(x86)中链接到的所有库实际上都是x86库,因为它们不一定...

例如我链接到C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Professional \ SDK的lib文件引发了该错误,最终我在C:\ Program Files(x86)中找到了它的x86版本)\ Windows Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86,一切正常。

答案 20 :(得分:0)

对于某些使用命令提示符(dos提示符)的用户 这可能会有所帮助:

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" --help
Error in script usage. The correct usage is:
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option]
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] [version number]
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store [version number]
where [option] is: x86 | amd64 | arm | x86_amd64 | x86_arm | amd64_x86 | amd64_arm
where [version number] is either the full Windows 10 SDK version number or "8.1" to use the windows 8.1 SDK
:
The store parameter sets environment variables to support
  store (rather than desktop) development.
:
For example:
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 10.0.10240.0
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store 10.0.10240.0
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 8.1
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 store 8.1
:
Please make sure either Visual Studio or C++ Build SKU is installed.

也可以这样:

CL“%1%2%3” / EHsc / link user32.lib Gdi32.lib Winmm.lib comctl32.lib *。obj / SUBSYSTEM:CONSOLE / MACHINE:x86

您必须先 del * .obj ;为了避免将链接器与以前的编译遗留下来的64位和32位对象混淆?

答案 21 :(得分:0)

就我而言,将环境变量 PROCESSOR_ARCHITECTURE 设置为 AMD64 解决了问题。

https://social.msdn.microsoft.com/Forums/en-US/f9303904-81ce-405d-85b3-b66d97e49971

答案 22 :(得分:0)

对于那些使用QT Creator的人,问题是相同的(如@ c-johnson所述)。 确保套件中MSVC的编译器设置设置为x86,如下所示。

QT Creator Kit Settings for MSVC x86 compiler

答案 23 :(得分:0)

当我将我的VS2008解决方案转换为VS2010&amp;将win32配置更改为X64,在我的旧解决方案中我有mfcs90d.lib(Configuration-&gt; Linker-&gt; Input-&gt; Additional dependencies),因为我使用的是VS010我刚刚在VS2010文件夹中检查过它是mfcs100d.lib,所以我将mfcs90d.lib更改为mfcs100d.lib(Configuration-&gt; Linker-&gt; Input-&gt; Additional dependencies),它运行正常。

答案 24 :(得分:0)

首先尝试以下事项: 1.转到配置管理器并创建一个新的x64(如果它还没有)。 2.选择x64解决方案。 3.转到项目属性,然后链接 - >高级选择x64机器。 4.现在重建解决方案。

如果您仍然遇到同样的错误。尝试清洁解决方案,然后再次重建并打开visual studio,您将获得最近打开的项目列表,右键单击该项目并从那里删除它。现在转到解决方案并再次重新打开解决方案。

答案 25 :(得分:0)

如果项目设置为在“项目属性”中具有相同的中间目录,则也可能发生此问题。配置属性 - &gt;一般

答案 26 :(得分:0)

模块机器类型是您要编译的机器,目标机器类型是您要为其构建二进制文件的体系结构x86或x64。

答案 27 :(得分:-1)

什么是操作系统?如果它是一个Windows x64,那么你需要确保安装了CUDA x64,因此VS2008应该在x64模式下编译项目......

CUDA只会在windows中安装x64 OR x86