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

我使用CUDA (vc++, Visual studio 2008sp1)来调试FEM程序。由于cuda的不足,该程序只能在Win32平台上运行。我认为链接的库文件都是在x86平台上编译的,但是当我编译它时,我得到了错误消息

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

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

398966 次浏览

你可能有一个针对x64(这是模块机器类型)的. obj或. lib文件,而你链接的是x86(这是目标机器类型)。

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

我写了一个博客条目关于这个,因为我遇到了这个令人抓狂的问题,并最终猛拉我的系统回到工作状态。

以下是需要检查的事项,按顺序:

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

  2. 在visual studio的主菜单中选择Build > Configuration Manager。确保您的项目指定了正确的平台。IDE可以设置为生成x64,但解决方案中的单个项目可以设置为目标win32。所以,visual studio给自己留了很多绳子,但这就是生活。

  3. 检查你的库文件是否真的属于你所瞄准的平台类型。这可以通过使用visualstudio VC\bin目录中的dumpbin.exe来使用。使用-headers选项转储所有函数。查找每个函数的机器条目。如果是64位版本,它应该包含x64。

  4. 在visual studio中,从主菜单中选择Tools > Options。选择项目和解决方案> vc++目录。从平台下拉菜单中选择x64。确保第一个条目是:$(VCInstallDir)\bin\x86_amd64,然后是$(VCInstallDir)\bin

一旦我完成了第4步,一切都恢复正常了。问题是我在我所有的项目中都遇到了这个问题,我想编译一个64位的目标。

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

我查看了在谷歌(目标机器,vc++目录,DUMPBIN....)上搜索此错误时发现的所有内容,一切看起来都OK。

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

在vcproj文件之间进行差异,发现了问题....

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

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

C约翰逊列表之外,我将添加以下点:

Check in Visual Studio:
项目属性->配置属性-> link ->命令行

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

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

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

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

提示是在编译日志。 这样的:< / p >

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

"-machine 32"是个问题。

第一个设置64bit编译选项, 下一步重新设置混合编译选项。

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

我选择了x64命令提示符并轻松地执行了配置。当我尝试nmake时,它给出了这个错误。

我想有些组件是为32位系统预建的。这个错误甚至报告了哪些模块是为x86构建的。

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

模块机类型是您正在编译的机器,目标机类型是您正在为其构建二进制文件的x86或x64架构。

如果您的解决方案有库项目,请检查属性->图书管理员->通用中的目标机器属性

在Visual Studio 2013中,

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

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

参见示例1) < img src = " https://i.imgur.com/TMXKA6X.jpg " / > < / p >

除了Jhonson的列表,还可以查看图书馆的文件夹

在visual studio中,从主菜单中选择Tools > Options。选择项目和解决方案> vc++目录。从平台下拉菜单中选择x64。

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

由于问题是由于编译和目标机器规格的差异(x86 &x64)

.

.
  1. 打开要配置的c++项目。
  2. 选择“配置管理器”按钮,打开“配置管理器”对话框。
  3. 在“主用解决方案平台”下拉列表中,选择相应的选项,打开“新建解决方案平台”对话框。
  4. 在“类型或选择新平台”下拉列表中选择64位平台。

它解决了我的问题。

在Visual Studio 2012 +/-中,“配置属性”. linker的属性页。“命令行”包含一个标记为“附加选项”的框。如果您正在构建x64,请确保该方框不包含/MACHINE:I386。我的项目是这样做的,它产生了问题中的错误。

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

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

“……;(VC_LibraryPath_x86);美元(WindowsSDK_LibraryPath_x86);“

而不是_x64。

我用的是CMake &然后添加一个win32配置。属性页显示x86,但实际上在文本编辑器中打开vcxproj文件时,它是x64!手动切换到x86解决了这个问题。

首先,尝试以下事情: 1. 进入配置管理器,并创建一个新的x64,如果它已经不在那里。 2. 选择x64解决方案。 3.进入项目属性,然后链接器->高级选择x64机器。 4. 现在重新构建解决方案

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

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

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

我会先看看那里,然后再看C·约翰逊的待办事项清单。

当我把我的VS2008解决方案转换为VS2010 &时,这发生在我身上。将win32配置更改为X64,在我的旧解决方案中,我有mfcs90d。lib(配置->连接器->输入->附加依赖项),因为我正在使用VS010,我刚刚在VS2010文件夹中检查了它是mfcs100d。所以我改变了mfcs90d。Lib到mfcs100d。lib(配置->链接器->输入->附加依赖项)它工作得很好。

所有的项目设置看起来都很完美,但我仍然得到了错误。查看.vcxproj文件并搜索“x86”就会发现问题:

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

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

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

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

对于那些使用QT Creator的人来说,问题也是一样的(正如@c-johnson所描述的那样)。 确保你的工具包中的MSVC的编译器设置设置为x86,如下所示

QT Creator Kit Settings for MSVC x86 compiler

使用命令提示符(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 /链接user32。自由Gdi32。自由Winmm。自由comctl32。lib * .obj /子系统:CONSOLE /MACHINE:x86

你必须德尔* .obj 之前;为了避免混淆链接器与64和32位对象从以前的编译遗留下来?

上面有很多好的建议。

另外,如果你试图在x86 Win32中构建:

确保你在Program Files(x86)中链接到的所有库实际上都是x86库,因为它们不一定…

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

我的目标是一个x64 Windows 10文本模式DOSBox应用程序在C语言。 使用“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

你会发现还有很多其他的vcvarxxxx .bat,只有这一个词。

我为自己解决了这个问题,如下所示。

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

然后我用编辑器检查了.vcxproj文件,并注意到<链接在两个(调试和发布)x64配置的属性没有指定<TargetMachine >,而Win32配置都包含<进行比;MachineX86 & lt;/指定的在。

然而,我已经验证,从Visual Studio在Properties >配置属性>链接器在先进的祝辞目标机器,即x64配置说MachineX64 (/ Machine: x64)。

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

我重建了它,它成功了。

在我的例子中,将环境变量PROCESSOR_ARCHITECTURE设置为AMD64

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

.

属性→configurationManager→ActiveSolutionPlatform。这里选择x64。

它应该照顾到所有的依赖关系,编译应该能够顺利进行