将32位非托管VC ++项目转换为64位

时间:2011-07-14 23:09:54

标签: visual-c++

我正在开发一个32位环境。我有一个包含一组C#项目和一组VC ++非托管项目的解决方案。对于所有C#项目,构建平台已设置为“任何CPU”,而对于VC ++项目,它是Win32。我们正在迁移到64位平台。 现在我的问题是

1)我可以在 32位环境中将我的32位VC ++ Dll转换为64位吗?

2)是否有办法将VC ++项目的平台设置为“任何CPU”?

3)我在VS2008的Build菜单下打开了Configuration Manager。将Active Solution平台设置为Any CPU(我之前没有将其更改为仅此平台),然后我将VC ++项目的平台设置为X64。现在我清理了解决方案,并尝试重新构建解决方案。 VC ++项目没有构建,因此也没有构建引用VC ++项目的C#项目。我尝试独立构建VC ++项目,我得到了这个错误:“致命错误LNK1112:模块机器类型X86与目标机器类型x64冲突

非常感谢任何想法和建议!

谢谢, Keerti Somasundaram

2 个答案:

答案 0 :(得分:7)

  

我可以在32位环境下将32位VC ++ Dll转换为64位吗?

如果您有64位编译器(某些版本的Visual Studio不包含64位编译器等),您当然可以使用32位系统来编译64位系统的代码。由于您可以将目标平台设置为x64并编译代码,因此您可以使用编译器。

如果在32位系统上进行编译,则测试和调试会更加困难。显然你必须在x64系统上运行测试,所以现在你被迫使用远程调试器。

  

是否有办法为VC ++项目设置平台   还有像“任何CPU”这样的东西?

对于原生C ++来说,这是没有意义的。本机代码dll绝对是32位或64位代码文件。托管代码可以支持“任何CPU”,因为JIT负责将IL编译到实际的平台操作码中,因此它可以根据需要转换为x86或x64。

  

VC ++项目没有建成

使用Build菜单的Configuration manager命令检查构建配置。您可能会发现配置中有一个用于x64平台的VC ++ Dll项目的条目,但未选中Build复选框。

  

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

链接器告诉您链接文件的目标是x64(这是您想要的),但是输入到链接器的模块(文件)是为x86构建的,因此它与该目标冲突。你解决这个问题的方法取决于模块是什么。

如果您通过编译项目的某个cpp文件而创建的obj文件出现此错误,那么问题是您的项目正在编译x86而不是x64的cpp文件。

更有可能是因为链接到项目的LIB文件(或其他文件)而出现此错误 - 例如来自某个SDK的LIB文件。在这种情况下,修复可能是为了更改项目属性,因此您使用正确的(即x64)LIB文件。某些SDK对32位和64位版本的LIB文件使用不同的文件名。其他人对LIB文件使用相同的名称,但将x86和x64版本存储在不同的目录中。

开始寻找的好地方是Project |属性|链接。在“常规”选项卡上,有一个“附加库目录”字段。其中的任何条目都应该指向x86和x64平台的不同目录(除非使用特定目录来保存x86和x64文件)。在“输入”选项卡上,有一个“附加依赖项”字段。对于所有平台,其中的任何条目应该相同(除非使用不同的文件名来区分x86和x64文件)。

另一个要检查的地方是工具|选项|项目和解决方案| VC ++目录。这些设置列出了搜索特定类型文件的各种目录。每个平台都有单独的列表。在您的情况下,您需要检查“库文件”列表。对于x64平台,您需要确保“库文件”列出指定包含x64版本库文件的目录。

答案 1 :(得分:3)

就我自己解决这个问题而言,我发现以下链接非常有用。

http://msdn.microsoft.com/en-us/library/9yb4317s.aspx

对我来说,我试图将32位VC ++ VS2010应用程序转换为64位应用程序。

我遇到了诸如

之类的错误
  

链接警告lnk4068 / machine未指定默认为x86

  

致命错误lnk1112模块机器类型'x86'与目标冲突   机器类型'x64'

我遵循了其他各种网站的建议,但需要有关目标/机器设置的信息。

对我来说,设置这个是一种享受:

  

项目设置\配置属性\ Librarian \ General \ Target Machine

旧值:空白(默认为x86) 新值:MachineX64(/ MACHINE:X64)

希望这有助于其他人。