【问题标题】:linking problem: fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'链接问题:致命错误 LNK1112:模块机器类型“x64”与目标机器类型“X86”冲突
【发布时间】:2011-02-20 10:15:45
【问题描述】:

我正在尝试从 wxFreeChart 库运行示例应用程序。编译链接后出现错误:

wxcode_msw28d_freechart.lib(wxfreechart_lib_xydataset.obj) : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

我尝试将链接器选项\advanced\target 机器切换到 MachineX64,但它不起作用。

我正在使用 Visual Studio 2008,有什么建议吗?

感谢帮助

【问题讨论】:

  • 您使用的是 32 位还是 64 位架构?
  • 你能描述一下“......它不起作用。”请再说几句?
  • 表示同样的错误
  • 如果您使用 CMake,请在 Visual Studio 的 x64 命令提示符下生成构建文件。
  • 这通常是因为配置和平台的组合之一由于错过更新而与其他组合不同,或者一开始没有为任何组合正确设置。基本上,您的程序会尝试在 x64 模块中使用 x86 库,因为在 95% 的情况下您看到此类错误时引用错误或缺失。

标签: c++ visual-studio linker


【解决方案1】:

错误很明显,您正在尝试链接使用不同 CPU 目标编译的库。可执行映像只能包含纯 x86(32 位)或纯 x64(64 位)代码。无法混合。

您可以通过为项目创建新配置来更改目标 CPU,仅更改链接器设置是不够的。构建 + 配置管理器,右上角的活动解决方案平台组合,选择新建并选择 x64。这将创建一个新配置,其中包含几个修改过的项目设置,最重要的是将使用的编译器。

请注意,在 VS2010 之前,默认情况下安装 64 位编译器。如果您在平台组合中没有看到 x64,那么您需要重新运行 setup.exe 并打开安装 64 位编译器的选项。然后重新运行您可能已应用的任何服务包安装程序。

使用 32 位版本的库。

【讨论】:

  • 它是合乎逻辑的,但我在 Windows 上使用 makefile 编译了这个库,并且(我认为)默认设置为 32 位架构。
  • 嗯,当您遇到无法解释的错误时,请避免做出假设。
  • 我解释了我的错误,你不知道答案就不要回答
  • 我解释了这个错误的原因。如果您不喜欢答案,请不要问。
【解决方案2】:

我也遇到了这个问题,找到了解决办法。

首先谈谈我是如何解决这个问题的。我有一个在 x86 中构建的项目。然后我使用配置管理器添加 x64,我遇到了这个问题。

通过仔细查看BuildLog.htm,我看到这两个都列为链接器选项:

/MACHINE:X64  
/machine:X86 

我在“属性页”对话框中找不到可以更改此设置的任何位置,因此我打开了 .vcproj 文件并查找了相应的行并将其更改为:

AdditionalOptions=" /STACK:10000000 /machine:x64 /debug"

问题解决了。

【讨论】:

  • 这个答案帮助我找到了一个解决方案,在我试图从 32 位转换为 64 位的不同项目上发生了非常相似的事情。结果我错过了将附加选项中的显式 /machine:X86 设置转换为 /machine:x64
  • 也为我工作。使用Hans Passant 提到的方法,您可能需要再次设置一些依赖项和属性(您之前设置的)。
  • 顺便说一句,“附加选项”可以在 GUI 下的链接器/命令行/附加选项下找到
【解决方案3】:

转到项目属性-> 配置属性-> Librarian 将目标机器设置为 MachineX64 (/MACHINE:X64)

【讨论】:

    【解决方案4】:

    在我的情况下,这似乎是因为我将设置从 32 位“复制”到了新配置(64 位)并且它没有更新库。奇怪的。

    1>MSVCRTD.lib(ti_inst.obj):致命错误 LNK1112:模块机器类型“X86”与目标机器类型“x64”冲突

    这意味着“你的属性 -> VC++ 目录 -> 库目录”指向一个包含 32 位库的目录。以某种方式修复!

    就我而言http://social.msdn.microsoft.com/Forums/ar/vcgeneral/thread/c747cd6f-32be-4159-b9d3-d2e33d2bab55

    参考:http://betterlogic.com/roger/2012/02/visual-studio-2010-express-64-bit-woe

    【讨论】:

      【解决方案5】:

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

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

      这解决了我的问题。

      【讨论】:

        【解决方案6】:

        尝试在 x64 属性中将每次出现的 .\Release 更改为 .\x64\Release。至少这对我有用...

        【讨论】:

          【解决方案7】:

          我知道这有点老了,但我想我会提供另一个提示。 在我的情况下,我继承了我必须维护的这个应用程序。 VS2008 项目在 C/C++->OutputFIles->"ObjectFIleName" 和 "Program Database File Name" 中带有相同的字符串(对于 Win32 和 x64 平台)。 所以当我构建Win32平台时,它构建得很好,但是当我尝试构建x64时,我得到了错误:

          \Debug64\Objects\common.obj:致命错误 LNK1112:模块机器类型“X86”与目标机器类型“x64”冲突

          显然,两个 patform 都将 common.obj 存储在同一个位置,所以当我尝试构建 x64 时,链接器获取了现有的目标文件,即 x86。

          为了解决这个问题,我只是将现有字符串替换为 x64 的宏“$(IntDir)\”(无引号),并确保宏解析为正确的路径,就像在其他项目中一样。 这解决了我的问题。

          【讨论】:

            【解决方案8】:

            i00g 和 Thomas 的答案的更新,这次是 VS2012(一些名称已更改)。使用配置管理器将 x86 设置复制到 x64 目标后,您将遇到问题,原因与之前的情况相同(lib 目标在 x64 配置中不正确)。打开您的 .vcxproj(文本编辑器)并在适当的地方将 MachineX86 替换为 MachineX64。 (我还没有找到它在属性表上的位置......)这似乎只是静态库所必需的。

            【讨论】:

              【解决方案9】:

              在执行“compile -DIPLIB=NONE filename.cxx”步骤之前 将 VIsual Studio 的安装路径放到 vcvarsall 批处理文件中并更改配置,如下所示。

              *C:\apps\MVS9\VC\vcvarsall.bat x86_amd64*

              现在下一步应该是

              编译 -64bit -DIPLIB=none filename.cxx

              这解决了我的问题

              【讨论】:

                【解决方案10】:

                感谢大家的回答。我的问题是我仅在配置管理器中将 Visual Studio 中的 x64 解决方案更改为 32 位。我最终只是创建了一个 32 位的新解决方案,然后复制了我的 C++ 代码,这个错误就消失了。我认为 l00g33k 和 RogerAttrill 的建议可能是解决方案,但我的也有效。

                【讨论】:

                  【解决方案11】:

                  最近,我也遇到了这个问题。那是因为我在 vs win32 中使用了 qt(x64)。如果要使用qt应用x64,可以选择vsx64--如上。如果你想使用win32,可能你还没有,你需要下载qt(32bit),然后正确设置你的环境,比如lib目录等(注意:可能你是老设置在x64(other version),如果你将你的win32或x64转换成另一个,Additional Dependencies包括旧目录!)

                  【讨论】:

                    【解决方案12】:

                    此问题与链接器无关,因此修改其设置不会影响结果。你得到这个是因为我假设你正在尝试以 x86 为目标,但出于某种原因,wxcode_msw28d_freechart.lib 正在构建为 x64 文件。

                    尝试查看 wxcode_msw28d_freechart.lib 以及它派生的任何源代码。您的问题正在那里发生。查看是否有一些特殊的构建步骤使用了错误的工具集(x64 而不是 x86)。

                    【讨论】:

                      【解决方案13】:

                      基于这些答案 - 我还必须在 Librarian -> 命令行 -> 附加选项(对于 x64 平台)下修改 X86 参考

                      【讨论】:

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