MS Visual Studio Professional 2013 - C ++为32位和64位操作系统编译单个可执行文件?

时间:2013-09-16 15:44:17

标签: c++ windows visual-studio 32bit-64bit configurationmanager

谷歌给了我一个线索,可能将代码编译成一个可执行文件,在32位操作系统上 32位,在 64位上运行64位操作系统。可执行文件是否真的可以在运行时确定其位数?

就我而言,目标系统为Windows 7 Professional x64Windows XP SP3 x86

所以我在各种文章中读到的内容(我认为甚至有关于SO的类似主题的答案)是必须转到Soltuion的{​​{1}}( RMB到解决方案 - > 配置管理器)并将Configuration Manager设置为任意CPU

现在所有这些文章都描述了旧版MSVS或MSVC ++版本的设置,但我认为2013 RC版本(我刚刚安装的版本)Platform没有重大变化。

Configuration Manager下拉列表中,我没有Active Solution选项,因此我按照了在SO上找到的 this recipe 。在我的情况下,在这个小指南失败后,我仍然无法在执行第5步时选择Any CPU

  • 5)确保在New Platform下选择“Any CPU”。如果有的话 在步骤3中没有任何CPU解决方案平台,然后确保“创建 新的解决方案平台“复选框已选中。然后单击确定。

我可以使用的下拉项目是Any CPUx64ARM,但默认情况下已添加),我无法选择Win32

添加目标平台Any CPU并编译可执行文件正常,该程序在Windows 7 x64上以64位运行,但当然无法在32位Windows XP计算机上运行。

如何在 Microsoft Visual Studio Professional 2013 RC 中将目标平台设置为x64

5 个答案:

答案 0 :(得分:2)

不,绝对不是。您需要定义单独的可执行文件。

“Any CPU”下拉列表允许您为多个平台设置编译器设置(例如,x64和Win32的_DEBUG处理器)您实际上无法构建到该目标。

答案 1 :(得分:2)

AnyCPU是指.Net程序,而不是C ++。 C ++必须编译为本机,x86或x64。您可以构建64位程序并将其捆绑到您的32程序中,并在运行时将其解压缩。 ProcessExplorer使用此技术。

答案 2 :(得分:2)

也许不是一个真正的答案,但对于大多数事情,在64位系统上运行32位代码工作得非常好。当然,它可能运行速度稍慢,但与必须处理(并彻底测试)两个不同的二进制文件相比,除非它在64位模式下具有显着的性能优势(或者您的应用程序使用超过大约2GB的内存空间),我很想使用32位模式。

答案 3 :(得分:1)

MacOS支持称为“胖二进制文件”的东西,程序编译两次,两个版本都打包到一个文件中。操作系统决定实际启动哪个版本。

Windows没有类似的内容。

答案 4 :(得分:1)

您可以将.NET包装器(任何CPU)和其余程序编译为yourprogram86.dll和yourprogram64.dll

[DllImport("yourprogram32.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "open")]
public static extern void open32();

[DllImport("yourprogram64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "open")]
public static extern void open64();       

static bool Is64()
{
    //.Net 4.0
    //Environment.Is64BitOperatingSystem

    //.Net 2.0
    return IntPtr.Size == 8;
}

static void open()
{
  if (Is64())
    open64();
  else
    open32();
}