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

use*_*382 171 visual-c++-2008 visual-c++

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

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

C J*_*son 246

我写了一篇关于此的博客文章,因为我遇到了这个令人抓狂的问题,最后我的系统又恢复了正常运行状态.

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

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

  2. 从visual studio的主菜单中选择Build> Configuration Manager.确保您的项目具有指定的正确平台.可以将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.

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

  • 对于那些使用Visual Studio 2013的人 - 已弃用第4步,您现在可以在项目属性中进行更改 - >配置属性 - > VC++目录 - 库目录 (35认同)
  • 生命保护.同样在步骤4中,"库目录"也需要更新为64位路径 (6认同)
  • 如果您使用的是编译为x86的外部库,您也会收到此错误.在尝试使用Google Test libs构建项目时遇到了它. (2认同)
  • 如果我没有项目文件(在Makefile上运行nmake),我该如何做同样的事情? (2认同)
  • 如何在命令行中执行此操作而不是在GUI版本中创建项目? (2认同)
  • 如果您的项目是静态库,则可能需要查看“配置属性>库管理器>常规>目标计算机”。不知道我是否应该为此编辑原始答案,希望可以在此处找到相关信息。 (2认同)

ser*_*gtk 135

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

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

"附加选项"不应包含 /machine:X86

我有这样的密钥,由CMake输出生成:CMake生成x86项目,然后我Configuration Manager在Visual Studio 2010中添加了x64平台- 除了链接器命令行之外,一切都是为新平台创建的,/machine:X86单独指定.

  • 这正是我的问题!但它是一个CMake生成的Visual Studio 2017项目,我使用Configuration Manager创建x64平台构建配置(其中复制了Win32构建配置以创建x64构建配置).会发生什么是"所有选项 - >附加选项"和"高级 - >目标机器"之间的链接器"/ MACHINE:"设置冲突.要修复,只需删除"所有选项 - >附加选项" - >"/ MACHINE:"设置. (15认同)
  • 这是对我的修复,所以我只是想表示感谢,奇怪的是我已经投票了,所以我一定是来过这里同样的问题!:) (3认同)
  • 这可能为我节省了几个小时。谢谢! (2认同)
  • 此解决方案的轻微变体:我的解决方案中的某些项目在配置属性中没有“链接器”。相反,他们有“图书管理员”。在这些情况下,确实是图书管理员 --> 所有选项 --> 附加选项表示 /machine:x86 而图书管理员 --> 所有选项 --> 目标机器表示 /machine:x64。我从 Librarian --> All Options --> Additional Options ... 中删除了 x86,最终构建并链接了东西。 (2认同)

小智 53

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

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

最后,我创建了一个新的测试项目,并做了相同的更改,似乎工作.

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

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

在Linker-> Advanced-> Target Machine下删除并正确设置,问题就消失了.

  • 这也是我的问题 - 但这来自使用CMake创建的Visual Studio解决方案.看起来像CMake也喜欢添加这个选项. (8认同)
  • 我来自一个CMake项目,可以确认它添加了这个选项. (4认同)

lam*_*345 23

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

<Lib>
  <AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>
Run Code Online (Sandbox Code Playgroud)

快速搜索/替换所有出现(十个单独的文件设置)修复了问题.

  • 同样在项目属性-&gt;配置选项-&gt;图书管理员-&gt;所有选项-&gt;其他选项中。 (3认同)
  • 这就是我的案例中的问题。感谢您的回答,它解决了我的问题。 (2认同)

hab*_*hab 13

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

  1. 打开要配置的C++项目.
  2. 选择"配置管理器"按钮以打开"配置管理器"对话框.
  3. 在Active Solution Platform下拉列表中,选择打开New Solution Platform对话框的选项.
  4. 在"类型"或"选择新平台"下拉列表中,选择一个64位平台.

它解决了我的问题.


Pat*_*ick 11

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

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

  • 当我遇到此错误消息时,这是我的根本原因.我以前为一个架构构建,并没有正确清理以前版本中的目标文件和库.从上一个版本中删除所有旧的.obj和.lib文件后,我能够使用新架构编译我的项目. (3认同)

lal*_*men 6

在Visual Studio 2012 +/-中,"Configuration Properties".Linker."命令行"的属性页包含一个标有"其他选项"的框.如果要构建x64,请确保该框不包含/ MACHINE: I386.我的项目确实存在并产生了错误.