致命错误LNK1112:模块机器types“x64”与目标机器types“X86”冲突

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

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

当我遇到这个疯狂的问题时,我写了一篇关于这个的博客文章,最后把我的系统放回工作状态。

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

  1. 在链接器设置中检查属性选项:属性>configuration属性>链接器>高级>目标机器。 如果您的目标是64位版本,请selectMachineX64,如果您正在创build32位版本,请selectMachineX86。

  2. 从Visual Studio的主菜单中selectBuild> Configuration Manager。 确保您的项目具有指定的正确平台。 可以将IDE设置为构buildx64,但解决scheme中的单个项目可以设置为针对win32。 所以是的,视觉工作室留下了很多绳子挂上自己,但那就是生活。

  3. 检查你的库文件,他们确实是平台types的目标。 这可以通过使用您的Visual Studio VC \ bin目录中的dumpbin.exe来使用。 使用-headers选项来转储所有的函数。 查找每个function的机器条目。 它应该包括64位,如果它是64位版本。

  4. 在Visual Studio中,从主菜单中select工具>选项。 select项目和解决scheme> VC ++目录。 从平台下拉列表中selectx64。 确保第一个条目是: $(VCInstallDir)\ bin \ x86_amd64,然后是$(VCInstallDir)\ bin

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

除了C约翰逊名单之外,我还要补充以下几点:

入住Visual Studio:
项目属性 – >configuration属性 – >链接器 – >命令行。

“附加选项”不应该包含/machine:X86

我有这样的关键,由CMake输出生成: CMake生成的x86项目,然后通过Visual Studio 2010中的Configuration Manager添加x64平台 – 除了连接器命令行,指定/machine:X86分开后,一切都为新平台创build。

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

当在Google上search这个错误(目标机器,VC ++目录,DUMPBIN ….)时,我查看了所有find的东西,而且一切都正常。

最后,我创build了一个新的testing项目,并做了相同的更改,似乎工作。

做vcproj文件之间的差异显示问题….

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

在链接器 – >高级 – >目标机器下删除并正确设置使问题消失。

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

  1. 打开你想要configuration的C ++项目。
  2. selectconfigurationpipe理器button打开configurationpipe理器对话框。
  3. 在“活动解决scheme平台”下拉列表中,select打开“新解决scheme平台”对话框的选项。
  4. 在Type中select新的平台下拉列表,select一个64位的平台。

它解决了我的问题。

您可能有一个.OBJ或.LIB文件的目标是x64(这是模块机器types),而您正在链接到x86(这是目标机器types)。

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

所有的项目设置似乎很完美,但我仍然有错误。 查看.vcxproj文件并search“x86”显示问题:

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

快速search/replace所有发生(十个单独的文件设置)解决了这个问题。

在Visual Studio 2012 +/-中,“configuration属性”的属性页面“命令行”包含一个标有“其他选项”的框,如果您要构buildx64,请确保该框不包含/ MACHINE: I386。我的项目确实产生了这个错误。

在Visual Studio 2013中,

1)检查项目属性页面/configuration属性/链接器/所有选项,并更正所有错过configuration的机器和目录。

2)检查项目属性页面/configuration属性/链接器/input,并更正所有未命中configuration的目录。

见1)的例子)

在构buildQT时,我遇到了这个问题。 我在某处阅读的说明build议我使用VS命令提示configurationnmake。

我select了x64命令提示符,并执行configuration没有太多麻烦。 当我尝试nmake,它给了这个错误。

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

我使用了32位的默认VS命令提示符,它工作。

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

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

提示是在编译日志。 喜欢这个:

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

那个"-machine 32"是问题。

首先设置64bit编译选项,然后重新设置混合编译选项。 那么你可以看到成功。

如果您的解决scheme有lib项目,请在Property-> Librarian-> General中检查Target Machine属性

除了Jhonson的名单,还检查图书馆的文件夹

在Visual Studio中,从主菜单中select工具>选项。 select项目和解决scheme> VC ++目录。 从平台下拉列表中selectx64。

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

今天发生在我身上,因为我在x86模式下添加了一个库目录,并意外地删除了inheritance的目录,而不是硬编码。 然后切换到x64后,我的VC ++目录仍然是:

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

而不是_x64。

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

模块机器types是要编译的机器,而目标机器types是要构build二进制文件的x86或x64体系结构。

如果您的项目设置为在“项目属性” – >“configuration属性” – >“常规”中具有相同的中间目录,则也可能发生此问题

首先尝试以下事情:1.转到configurationpipe理器,并创build一个新的X64,如果它不在那里。 2.selectx64解决scheme。 3.转到项目属性,然后链接器 – >高级selectx64机器。 4.现在重build解决scheme。

如果你仍然得到相同的错误。 尝试干净的解决scheme,然后再次重build,打开Visual Studio,你会得到最近打开的项目列表,右键单击该项目,并从那里删除它。 现在转到解决scheme并重新打开解决scheme。

这是一个非常令人沮丧和恼人的问题,但是一旦你理解了它,这很简单:你有构build一个体系结构types(在你的情况x64)的一些元素,尽pipe它是另一种types的目标(比如x86 )。

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

在看完约翰逊的名单之前,我会先看看那里。

这发生在我身上,当我将VS2008解决scheme转换为VS2010并将win32configuration更改为X64时,在我以前的解决scheme中我有mfcs90d.lib(Configuration-> Linker-> Input-> Additional dependencies),因为我正在使用VS010在VS2010文件夹,它是mfcs100d.lib,所以我改变mfcs90d.lib mfcs100d.lib在(configuration – >连接器 – >input – >其他依赖项)它工作正常。

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

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

CUDA将只在Windows中安装x64或x86