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


187

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

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

Answers:


261

遇到这个令人抓狂的问题时,我写了一篇关于此的博客文章,最后使系统恢复正常工作。

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

  1. 在以下链接器设置中检查属性选项:属性>配置属性>链接器>高级>目标计算机。如果要针对64位版本,请选择MachineX64;如果要进行32位版本,请选择MachineX86。

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

  3. 检查您的库文件,使其确实属于目标平台类型。可以通过使用Visual Studio VC \ bin目录中的dumpbin.exe来使用它。使用-headers选项转储所有功能。查找每个功能的机器条目。如果是64位版本,则应包含x64。

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

一旦执行了第4步,一切都对我有效。问题是我在所有要编译为64位目标的项目中都遇到了这个问题。


6
救生员。同样在步骤4中,“库目录”也需要更新为64位路径
Gregory

37
对于使用Visual Studio 2013的用户-已弃用步骤4,现在您可以在项目属性->配置属性-> VC ++目录-库目录
PolyMesh 2014年

3
如果您使用的是编译为x86的外部库,则也会出现此错误。尝试使用Google Test库构建项目时遇到了这种情况。
kayleeFrye_onDeck

3
如果没有项目文件(在Makefile上运行nmake),我该怎么做?
user118967 '16

3
您如何在命令行上执行此操作,而不是在GUI版本中创建项目?
repzero

152

除了C Johnson清单,我还要补充以下几点:

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

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

我有这样的密钥,由CMake输出生成:CMake生成了x86项目,然后Configuration Manager在Visual Studio 2010中通过添加了x64平台-对于新平台,一切都很好地创建了,除了链接程序命令行是/machine:X86单独指定的。


20
这正是我的问题!但这是CMake生成的Visual Studio 2017项目,我在其中使用配置管理器创建x64平台构建配置(在其中复制Win32构建配置以创建x64构建配置)。发生的是链接器的“ /机器:”设置在“所有选项->其他选项”和“高级->目标机器”之间发生冲突。要解决此问题,只需删除“所有选项->其他选项”->“ /机器:”设置。
BoiseBaked

2
这可能节省了我几个小时。谢谢!
rsp1984

3
这是我的解决方法,所以只想说声谢谢,很奇怪,我已经投票赞成,所以我一定在这里之前也遇到过同样的问题!:)
亚当·登普西

1
此解决方案的轻微变化:解决方案中的某些项目在“配置属性”中没有“链接器”。相反,他们有“图书管理员”。在那种情况下,确实是图书管理员->所有选项->附加选项说/ machine:x86,而图书管理员->所有选项->目标机器说是/ machine:x64。我从图书馆员->所有选项->其他选项...中删除了x86,最终构建并链接了东西。
Xenial

感谢这些提示。对于CMake用户来说,这似乎是一个常见问题。投票。
郝曦

54

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

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

最终,我创建了一个新的测试项目,并进行了相同的更改,并且看起来可行。

在vcproj文件之间做一个比较就发现了问题。

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

删除它并在“链接器”->“高级”->“目标计算机”下正确设置,该问题消失了。


8
这也正是我的问题-但这来自使用CMake创建的Visual Studio解决方案。看起来CMake也喜欢添加此选项。
Nick Chadwick

4
我来自CMake项目,可以确认它添加了此选项。
BeeOnRope16年

25

所有项目设置似乎都很完美,但仍然出现错误。查看.vcxproj文件并搜索“ x86”发现了问题:

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

快速搜索/替换所有出现的情况(十个单独的文件设置)可以解决此问题。


3
同样在项目属性->配置选项->图书管理员->所有选项->其他选项中。
Xenial

13

由于问题是由于编译和目标机器规格(x86和x64)不同而引起的,请执行以下步骤:

  1. 打开您要配置的C ++项目。
  2. 选择“配置管理器”按钮以打开“配置管理器”对话框。
  3. 在“活动解决方案平台”下拉列表中,选择选项以打开“新解决方案平台”对话框。
  4. 在“类型”或“选择新平台”下拉列表中,选择一个64位平台。

它解决了我的问题。


12

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

在.OBJ文件上使用DUMPBIN / HEADERS,然后在FILE HEADER VALUES块中检查计算机条目。


3
这是我遇到此错误消息时的根本原因。我以前是为一种体系结构构建的,并且没有从先前的构建中正确清除目标文件和库。从以前的版本中删除所有旧的.obj和.lib文件后,我便可以使用新的体系结构编译项目。
2014年

这是我的问题,解决方案是在更改目标体系结构之前先进行清洁。

7

在Visual Studio 2012 +/-中,“配置属性” .Linker。“命令行”的属性页包含一个标记为“其他选项”的框。如果要构建x64,请确保该框不包含/ MACHINE: I386。我的项目做了,并且产生了有问题的错误。


4

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

我选择了x64命令提示符,并进行了许多麻烦的配置。当我尝试nmake时,它给出了此错误。

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

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


4
这使我走上了正确的轨道。如果要针对64位进行构建,则可以使用以下Windows快捷方式来设置环境:C:\ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat和“ C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat” x86_amd64和cd c:\ YourDir与此有关的重要部分是x86_amd64-无需设置环境设置为32位环境,然后qmake进行选择。
gremwell 2013年

3

在Visual Studio 2013中,

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

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

参见示例1)


2

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


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

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

提示位于编译日志。像这样:

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

"-machine 32"是问题。

首先设置64位编译选项,然后重新设置混合编译选项。然后您可以看到成功。


1

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


1

除了Jhonson的清单之外,还检查图书馆的文件夹

在Visual Studio中,从主菜单中选择“工具”>“选项”。选择项目和解决方案> VC ++目录。从平台下拉列表中选择x64。

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

1

今天发生了这件事,因为我仍然在x86模式下添加了一个库目录,并且不小心删除了继承的目录,而是对其进行了硬编码。然后,切换到x64后,我的VC ++目录仍然显示为:

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

而不是_x64。


谢谢。那是我的问题。对于将来的读者,我的“图书馆目录”现在为$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas

1

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


2
我有类似的东西。我不知道什么设置隐藏在哪里(我遵循了这里大多数答案的建议),但是相应地指定了生成器对我来说是这样:cmake。-G“ Visual Studio 12 Win 64”。
user55937

1

这是一个非常令人沮丧和烦人的问题,但是一旦您理解它,它就非常简单:尽管构建对象是另一种类型的对象(例如x86),但您正在构建某种元素来构建一种体系结构类型(在您的情况下为x64)。 )。

您可以通过查看导致崩溃的obj文件来剖析问题的根源,然后开始在其中查找问题。每个obj都有一个源代码类似物:cpp,c,asm等。围绕它的特殊构建事件可能使用了错误的工具。在属性表中进行检查。

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



0

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


0

如果您的项目在项目属性->配置属性->常规中设置为具有相同的中间目录,也可能会出现此问题


0

首先尝试以下操作:1.转到Configuration Manager并创建一个新的x64(如果尚未安装)。2.选择x64解决方案。3.转到项目属性,然后在Linker-> Advanced中选择x64计算机。4.现在重建解决方案。

如果仍然出现相同的错误。尝试使用干净的解决方案,然后重新构建并打开Visual Studio,您将获得最近打开的项目的列表,右键单击该项目并将其从此处删除。现在转到解决方案,然后再次重新打开解决方案。


0

当我将VS2008解决方案转换为VS2010并将win32配置更改为X64时,这会在我身上发生,在我的旧解决方案中,我具有mfcs90d.lib(配置->链接器->输入->其他依赖项),因为我使用的是VS010我刚刚检查了一下在mfcs100d.lib所在的VS2010文件夹中,因此我在(配置->链接器->输入->其他依赖项)中将mfcs90d.lib更改为mfcs100d.lib,它可以正常工作。



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

你必须德尔* .OBJ ; 为了避免将链接器与先前编译留下的64位和32位对象混淆?


0

上面有很多好的建议。

另外,如果您尝试在x86 Win32中构建:

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

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


-1

什么是操作系统?如果它是Windows x64,则需要确保已安装CUDA x64,因此VS2008应该以x64模式编译项目...

CUDA将仅在Windows中安装x64或x86


构建和尝试链接时,这似乎是一个错误。基本上,它在构建设置中不匹配或不一致;可以指定为各种构建步骤的参数的目标平台不一致。
莎米
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.