链接问题:致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突

时间:2010-05-17 13:45:08

标签: c++ visual-studio linker

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

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

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

我正在使用visual studio 2008,有什么建议吗?

感谢您的帮助

13 个答案:

答案 0 :(得分:33)

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

通过为项目创建新配置来更改目标CPU,仅更改链接器设置是不够的。在右上角的Build + Configuration Manager,Active solution platform组合中,选择New并选择x64。这将创建一个包含多个已修改项目设置的新配置,最重要的是将使用的编译器。

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

痛苦点较少的可行方法是使用32位版本的库。

答案 1 :(得分:17)

我也遇到了这个问题并找到了解决方案。

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

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

/MACHINE:X64  
/machine:X86 

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

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

问题解决了。

答案 2 :(得分:5)

在我的情况下,它似乎是因为我从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

答案 3 :(得分:5)

转到项目属性 - >配置属性 - >图书管理员 将目标机器设置为MachineX64(/ MACHINE:X64)

答案 4 :(得分:2)

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

  1. 打开要配置的C ++项目。
  2. 选择Configuration Manager按钮以打开Configuration Manager对话框。
  3. 在Active Solution Platform下拉列表中,选择打开New Solution Platform对话框的选项。
  4. 在“类型”或“选择新平台”下拉列表中,选择一个64位平台。
  5. 这解决了我的问题。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

我知道这有点旧,但我想我会提供另一个提示。 在我的情况下,我继承了我必须维护的这个应用程序。 VS2008项目带有与C / C ++相同的字符串 - > OutputFIles->“ObjectFIleName”和“程序数据库文件名”(适用于Win32和x64两个平台)。 所以当我构建Win32平台时,它构建得很好,但是当我尝试构建x64时,我得到了错误:

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

现在下一步应该是

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

这解决了我的问题

答案 9 :(得分:0)

谢谢你的回答。我的问题是我只在Visual Studio中将x64解决方案更改为32位。我最后只是创建一个32位的新解决方案,然后复制我的C ++代码,这个错误消失了。我认为l00g33k和RogerAttrill的建议可能是解决方案,但我的工作也是如此。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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