我正在使用CUDA(VC ++,Visual studio 2008sp1)来调试FEM程序。由于cuda的不足,该程序只能在Win32平台上运行。我认为链接的库文件都是在x86平台上编译的,但是当我编译它时,我收到错误消息“致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突”。
我试图将平台转换为x64,但它没有用。请告诉我:什么是“模块机器类型”什么是“目标机器类型”?我怎样才能克服它?
答案 0 :(得分:228)
我写了一篇关于这个的blog条目,因为我遇到了这个令人抓狂的问题,最后把我的系统拉回到正常工作状态。
这些是要检查的事项,按此顺序:
在以下位置检查链接器设置中的属性选项:属性>配置属性>链接器>高级>目标机器。如果您的目标是64位版本,请选择MachineX64;如果您正在构建32位版本,请选择MachineX86。
选择构建>配置管理器来自visual studio的主菜单。确保您的项目具有指定的正确平台。可以将IDE设置为构建x64,但解决方案中的单个项目可以设置为目标win32。所以是的,视觉工作室留下了很多绳索来吊死自己,但这就是生活。
检查您的库文件,他们确实是平台类型的目标。这可以通过使用visual studio VC \ bin目录中的dumpbin.exe来使用。使用-headers选项转储所有函数。查找每个功能的机器条目。它应该包括x64,如果它是64位构建。
在visual studio中,选择工具>主菜单中的选项。选择项目和解决方案> VC ++目录。从Platform下拉列表中选择x64。确保第一个条目是: $(VCInstallDir)\ bin \ x86_amd64 ,然后是 $(VCInstallDir)\ bin 。
一旦我做了第4步,一切都为我工作了。问题是我在所有项目中都遇到了这个问题,我想要编译为64位目标。
答案 1 :(得分:123)
除了 C Johnson 列表,我还要添加以下内容:
签入Visual Studio:
项目属性 - >配置属性 - >链接器 - >命令行。
“其他选项”不应包含/machine:X86
我有这样的密钥,由CMake输出生成:CMake生成x86项目,然后我在Visual Studio 2010中通过Configuration Manager
添加了x64平台 - 除了链接器命令行之外,所有内容都可以用于新平台,
/machine:X86
答案 2 :(得分:53)
当我尝试将X64版本添加到从VS2003转换的项目时,我在VS2008中遇到了同样的问题。
我查看了在Google上搜索此错误时发现的所有内容(目标计算机,VC ++目录,DUMPBIN ....),一切正常。
最后,我创建了一个新的测试项目并进行了相同的更改,似乎有效。
在vcproj文件之间进行差异显示问题....
我的转换项目已将/ MACHINE:i386设置为Linker->命令行下的附加选项集。因此,有两个/ MACHINE选项设置(x64和i386),另外一个选择优先。
在Linker-> Advanced-> Target Machine下删除并正确设置它会使问题消失。
答案 3 :(得分:21)
所有项目设置似乎都很完美,但我仍然遇到错误。查看.vcxproj
文件并搜索" x86"透露了问题:
<Lib>
<AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>
快速搜索/替换所有出现事件(十个单独的文件设置)解决了问题。
答案 4 :(得分:13)
由于问题是由于编译和目标机器规格不同(x86&amp; x64) 请按照以下步骤操作:
它解决了我的问题。
答案 5 :(得分:12)
当您链接x86(这是目标机器类型)时,您可能有一个针对x64(。模块机器类型)的.OBJ或.LIB文件。
在.OBJ文件上使用DUMPBIN / HEADERS并检查FILE HEADER VALUES块中的机器条目。
答案 6 :(得分:6)
在Visual Studio 2012 +/-中,&#34;配置属性&#39; .Linker。&#34;命令行&#34;的属性页。包含一个标有&#34;附加选项&#34;的框。如果您正在构建x64,请确保该框不包含/ MACHINE:I386。我的项目确实存在并产生了错误。
答案 7 :(得分:4)
我在构建QT时遇到了这个问题。我在某处阅读的说明建议我使用VS命令提示符配置nmake。
我选择了x64命令提示符并执行了配置而没有太多麻烦。当我尝试nmake时,它给出了这个错误。
我认为有些组件是为32位预构建的。该错误甚至报告了为x86构建的模块。
我使用32位默认VS命令提示符,但它有效。
答案 8 :(得分:3)
在Visual Studio 2013中,
1)检查项目属性页/配置属性/链接器/所有选项,并更正所有未命中配置的机器和目录。
2)检查项目属性页/配置属性/链接器/输入并更正所有未命中配置的目录。
参见1)的例子
答案 9 :(得分:1)
如果您的解决方案有lib项目,请检查Property-&gt; Librarian-&gt; General
中的Target Machine属性答案 10 :(得分:1)
除了Jhonson的列表,还要检查库的文件夹
在visual studio中,选择工具&gt;主菜单中的选项。选择项目和解决方案&gt; VC ++目录。从平台下拉列表中选择x64。
$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
答案 11 :(得分:1)
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"
设置64位编译选项-m64 -cubin
提示是在编译日志中。 像这样:
nvcc.exe ~~~~~~ -machine 32 -ccbin ~~~~~
"-machine 32"
是问题。
首先设置64位编译选项, 接下来重新设置混合编译选项。 那么你可以看到成功。
答案 12 :(得分:1)
我的目标是使用C语言的x64 Windows 10文本模式DOSBox应用程序。 使用“ 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
您会发现还有很多其他vcvarsxxxx.bat,只有这一个字。
答案 13 :(得分:1)
今天发生这种情况是因为我在x86模式下添加了一个库目录,并且意外地删除了继承的目录,使它们硬编码。 然后切换到x64后,我的VC ++目录仍然显示:
“...; $(VC_LibraryPath_x86); $(WindowsSDK_LibraryPath_x86);”
而不是_x64。
答案 14 :(得分:1)
我正在使用CMake&amp;然后添加了win32配置。属性页显示 x86 但实际上在文本编辑器中打开vcxproj文件时它是x64!手动更改为x86解决了这个问题。
答案 15 :(得分:1)
这是一个非常令人沮丧和恼人的问题但是一旦你理解了它,它就非常简单了:你有一些元素在构建一个架构类型(在你的情况下是x64)事实上,它是另一种类型的目标(比如x86)。
您可以通过查看导致崩溃的obj文件并开始在那里查找问题来剖析问题的根源。每个obj都有一个源代码模拟:在cpp,c,asm等中。可能存在使用错误工具的特殊构建事件。在属性表中检查。
在查看C Johnson要做的事情之前,我先先看一下。
答案 16 :(得分:1)
vcxproj文件可能包含'MACHINE:i386' 使用编辑器编辑vcxproj文件。删除它!
答案 17 :(得分:1)
答案 18 :(得分:0)
我已经按照以下步骤为自己解决了这个问题。
首先,我回答了这个问题的其他答案,只是得出所有项目设置都是正确的结论。
然后,我用编辑器检查了.vcxproj文件,并注意到两个(调试和发行)x64配置的属性未指定
但是,我已经从Visual Studio的“属性”>“配置属性”>“链接器”>“高级”>“目标计算机”中进行了验证,证实x64配置表示MachineX64(/ MACHINE:X64)。
因此,我编辑了.vcxproj文件,在两个x64配置中包括了
我重建了,并且成功了。
答案 19 :(得分:0)
上面有很多好的建议。
如果您尝试在x86 Win32中进行构建,则:
请确保您在程序文件(x86)中链接到的所有库实际上都是x86库,因为它们不一定...
例如我链接到C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Professional \ SDK的lib文件引发了该错误,最终我在C:\ Program Files(x86)中找到了它的x86版本)\ Windows Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86,一切正常。
答案 20 :(得分: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
您必须先 del * .obj ;为了避免将链接器与以前的编译遗留下来的64位和32位对象混淆?
答案 21 :(得分:0)
就我而言,将环境变量 PROCESSOR_ARCHITECTURE
设置为 AMD64
解决了问题。
https://social.msdn.microsoft.com/Forums/en-US/f9303904-81ce-405d-85b3-b66d97e49971
答案 22 :(得分:0)
答案 23 :(得分:0)
当我将我的VS2008解决方案转换为VS2010&amp;将win32配置更改为X64,在我的旧解决方案中我有mfcs90d.lib(Configuration-&gt; Linker-&gt; Input-&gt; Additional dependencies),因为我使用的是VS010我刚刚在VS2010文件夹中检查过它是mfcs100d.lib,所以我将mfcs90d.lib更改为mfcs100d.lib(Configuration-&gt; Linker-&gt; Input-&gt; Additional dependencies),它运行正常。
答案 24 :(得分:0)
首先尝试以下事项: 1.转到配置管理器并创建一个新的x64(如果它还没有)。 2.选择x64解决方案。 3.转到项目属性,然后链接 - >高级选择x64机器。 4.现在重建解决方案。
如果您仍然遇到同样的错误。尝试清洁解决方案,然后再次重建并打开visual studio,您将获得最近打开的项目列表,右键单击该项目并从那里删除它。现在转到解决方案并再次重新打开解决方案。
答案 25 :(得分:0)
如果项目设置为在“项目属性”中具有相同的中间目录,则也可能发生此问题。配置属性 - &gt;一般
答案 26 :(得分:0)
模块机器类型是您要编译的机器,目标机器类型是您要为其构建二进制文件的体系结构x86或x64。
答案 27 :(得分:-1)
什么是操作系统?如果它是一个Windows x64,那么你需要确保安装了CUDA x64,因此VS2008应该在x64模式下编译项目......
CUDA只会在windows中安装x64 OR x86