【问题标题】:fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'致命错误 LNK1112:模块机器类型“x64”与目标机器类型“X86”冲突
【发布时间】:2011-04-03 14:06:03
【问题描述】:

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

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

【问题讨论】:

    标签: visual-c++ visual-c++-2008


    【解决方案1】:

    我为此写了一个 blog 条目,因为我遇到了这个令人抓狂的问题,最后将我的系统拉回了工作状态。

    这些是要检查的内容,按以下顺序:

    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 位目标的所有项目中都遇到了这个问题。

    【讨论】:

    • 救命稻草。同样在第 4 步中,“库目录”也需要更新为 64 位路径
    • 对于那些使用 Visual Studio 2013 - 步骤 4 已弃用的用户,您现在在项目属性 -> 配置属性 -> VC++ 目录 - 库目录中进行更改
    • 如果您使用的是编译为 x86 的外部库,您也会收到此错误。我在尝试使用 Google 测试库构建项目时遇到了它。
    • 如果我没有项目文件(在 Makefile 上运行 nmake),我该如何做同样的事情?
    • 如何在命令行而不是在GUI版本中创建项目?
    【解决方案2】:

    除了 C Johnson 列表之外,我还要添加以下几点:

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

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

    我有这样的密钥,由 CMake 输出生成:CMake 生成 x86 项目,然后我在 Visual Studio 2010 中通过 Configuration Manager 添加了 x64 平台 - 除了链接器命令行,指定的所有内容都为新平台创建得很好/machine:X86 分开。

    【讨论】:

    • 这正是我的问题!但这是一个 CMake 生成的 Visual Studio 2017 项目,我在其中使用配置管理器创建 x64 平台构建配置(复制 Win32 构建配置以创建 x64 构建配置)。发生的情况是链接器的“/MACHINE:”设置在“所有选项->附加选项”和“高级->目标机器”之间发生冲突。要修复,只需删除“所有选项->附加选项”->“/MACHINE:”设置。
    • 这可能节省了我几个小时。谢谢!
    • 这对我来说是解决方案,所以只想说声谢谢,奇怪的是我已经投了赞成票,所以我以前一定遇到过同样的问题! :)
    • 此解决方案的轻微变体:我的解决方案中的某些项目在配置属性中没有“链接器”。相反,他们有“图书管理员”。在这些情况下,确实是 Librarian --> All Options --> Additional Options 说 /machine:x86 而 Librarian --> All Options --> Target Machine 说 /machine:x64。我从 Librarian --> All Options --> Additional Options ...中删除了 x86,最终构建并链接了东西。
    • 感谢这些提示。对于 CMake 用户来说,这似乎是一个常见问题。赞成票。
    【解决方案3】:

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

    我查看了在 Google 上搜索此错误时发现的所有内容(目标机、VC++ 目录、DUMPBIN....),一切正常。

    最后我创建了一个新的测试项目并做了同样的改变,它似乎工作了。

    在 vcproj 文件之间进行比较发现了问题....

    我转换后的项目将 /MACHINE:i386 设置为 Linker->Command Line 下的附加选项集。因此,设置了两个 /MACHINE 选项(x64 和 i386),另外一个优先。

    删除它并在 Linker->Advanced->Target Machine 下正确设置它使问题消失了。

    【讨论】:

    • 这也正是我的问题 - 但这来自使用 CMake 创建的 Visual Studio 解决方案。看起来 CMake 也喜欢添加这个选项。
    • 我来自一个 CMake 项目,可以确认它添加了这个选项。
    【解决方案4】:

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

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

    快速搜索/替换所有事件(十个单独的文件设置)解决了问题。

    【讨论】:

    • 也在项目属性 --> 配置选项 --> Librarian --> 所有选项 --> 附加选项。
    • 这是我的问题。感谢您的回答,它解决了我的问题。
    【解决方案5】:

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

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

    【讨论】:

    • 这是我遇到此错误消息时的根本原因。我之前为一种架构构建过,并且没有正确清理之前构建中的目标文件和库。从之前的构建中删除所有旧的 .obj 和 .lib 文件后,我能够使用新架构编译我的项目。
    • 这是我的问题,解决方案是在更改目标架构时在构建之前进行清理。
    【解决方案6】:

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

    1. 打开要配置的 C++ 项目。
    2. 选择配置管理器按钮打开配置管理器对话框。
    3. 在 Active Solution Platform 下拉列表中,选择选项以打开 New Solution Platform 对话框。
    4. 在类型或选择新平台下拉列表中,选择 64 位平台。

    它解决了我的问题。

    【讨论】:

      【解决方案7】:

      在 Visual Studio 2012 +/- 中,“配置属性”的属性页。链接器。“命令行”包含一个标有“附加选项”的框。如果您正在构建 x64,请确保该框不包含/MACHINE:I386。我的项目确实如此,但它产生了有问题的错误。

      【讨论】:

        【解决方案8】:

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

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

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

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

        【讨论】:

        • 这让我走上了正轨。如果您正在构建 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 就这样选择了它。
        【解决方案9】:
        "project property - CUDA Runtime API - GPU - NVCC Compilation Type"
        

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

        提示在编译日志中。 像这样:

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

        "-machine 32" 有问题。

        首先设置64位编译选项, 接下来重新设置混合编译选项。 然后你就可以看到成功了。

        【讨论】:

        • --machine 32,两个连字符
        【解决方案10】:

        在 Visual Studio 2013 中,

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

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

        参见 1) 的示例

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

            vcxproj 文件可能包含“MACHINE:i386” 使用编辑器编辑 vcxproj 文件。删除它!

            【讨论】:

              【解决方案13】:

              在我的例子中,将环境变量 PROCESSOR_ARCHITECTURE 设置为 AMD64 解决了这个问题。

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

              【讨论】:

                【解决方案14】:

                除了 Jhonson 的列表,还要检查库的文件夹

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

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

                【讨论】:

                  【解决方案15】:

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

                  "...;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);"

                  而不是 _x64。

                  【讨论】:

                  • 谢谢。那是我的问题。对于未来的读者,我的“图书馆目录”现在改为 $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
                  【解决方案16】:

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

                  【讨论】:

                  • 我有类似的东西。我不知道什么设置隐藏在哪里(我遵循了这里大多数答案的建议),但是指定生成器相应地为我做了: cmake 。 -G "Visual Studio 12 Win 64"。
                  【解决方案17】:

                  首先尝试以下操作: 1. 转到配置管理器并创建一个新的 x64(如果它不存在)。 2.选择x64解决方案。 3.进入项目属性,然后链接器->高级选择x64机器。 4. 现在重建解决方案。

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

                  【讨论】:

                    【解决方案18】:

                    这是一个非常令人沮丧和烦人的问题,但是一旦你理解了它,它就非常简单:你有一些元素在你正在构建的构建一个架构类型(在你的例子中是 x64)尽管它已经成为另一种类型的目标(比如 x86)。

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

                    在查看 C Johnson 的待办事项清单之前,我会先看看那里。

                    【讨论】:

                      【解决方案19】:

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

                      【讨论】:

                        【解决方案20】:

                        上面有很多好的建议。

                        如果您尝试在 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 一切正常。

                        【讨论】:

                          【解决方案21】:

                          我的目标是 C 语言的 x64 Windows 10 文本模式 DOSBox 应用程序。 使用“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 Community”在这台计算机上失败了。所以我的设置是正确的,以上所有答案都不起作用。

                          我想告诉你解决方案是这样的 make.bat:

                          call "c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" 
                          nmake -f makefile
                          

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

                          【讨论】:

                            【解决方案22】:

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

                            【讨论】:

                              【解决方案23】:

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

                              【讨论】:

                                【解决方案24】:

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

                                【讨论】:

                                  【解决方案25】:

                                  对于那些使用 QT Creator 的人,问题是相同的(如 @c-johnson 所述)。 确保套件中 MSVC 的编译器设置设置为 x86,如下所示。

                                  【讨论】:

                                    【解决方案26】:

                                    对于一些使用命令提示符(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 位对象混淆?

                                    【讨论】:

                                      【解决方案27】:

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

                                      CUDA 只会在 windows 中安装 x64 或 x86

                                      【讨论】:

                                      • 在构建和尝试链接时这似乎是一个错误。基本上它的构建设置不匹配或不一致;可以指定为各种构建步骤参数的目标平台不一致。
                                      【解决方案28】:

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

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

                                      然后我用编辑器检查了.vcxproj文件,发现两个(Debug和Release)x64配置的属性没有指定,而Win32配置都包含 MachineX86目标机器 >.

                                      但是,我已经从 Visual Studio 中的属性 > 配置属性 > 链接器 > 高级 > 目标机器中进行了验证,x64 配置表示 MachineX64 (/MACHINE:X64)。

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

                                      我重建了,它成功了。

                                      【讨论】:

                                        猜你喜欢
                                        • 2012-02-06
                                        • 2021-08-10
                                        • 1970-01-01
                                        • 2013-01-20
                                        • 2013-04-19
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多