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

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

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


当前回答

上面有很多好的建议。

另外,如果你试图在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 Community”通过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,只有这一个词。

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

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

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

检查在Visual Studio: 项目属性->配置属性-> link ->命令行。

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

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

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

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

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

然而,我已经验证了,从Visual Studio的属性>配置属性>连接器>高级>目标机,x64配置说MachineX64 (/ Machine: x64)。

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

我重建了它,它成功了。

vcxproj文件可能包含“MACHINE:i386” 用编辑器编辑vcxproj文件。把它拿掉!