phew
phew

Reputation: 836

MS Visual Studio Professional 2013 - C++ Compile single executable for 32bit and 64bit operating systems?

Google gave me a clue that it is possible to compile code into a single executable that will run as 32bit on a 32bit OS and as 64bit on a 64bit OS. Is it really possible for the executable to determine its bitness at runtime?

In my case the target systems would be Windows 7 Professional x64 and Windows XP SP3 x86.

So what I read on various articles (I think there was even answers to similiar topics on SO) is that one has to go to the Soltuion's Configuration Manager (RMB onto Solution -> Configuration Manager) and set the Platform to Any CPU.

Now all of these articles described a setup for older MSVS or MSVC++ versions, but I think there are no major changes to the Configuration Manager in the 2013 RC version (which I have just recently installed).

In the Active Solution dropdown I do not have the option Any CPU, so I followed this recipe that I found on SO. Following this little guide fails in my case, I still do not have the option to select Any CPU when following step 5:

The dropdown items that are available to me are x64 and ARM (Win32 too but that is already added by default), I can not chose Any CPU.

Adding target platform x64 and compiling the executable works fine, the program is ran as 64bit on Windows 7 x64 but ofcourse it can not be run on the 32bit Windows XP machine.

How do I set the target platform to Any CPU in Microsoft Visual Studio Professional 2013 RC?

Upvotes: 1

Views: 2701

Answers (5)

Tomas Kubes
Tomas Kubes

Reputation: 25178

You can compile the .NET wrapper (Any CPU) and the rest of program as yourprogram86.dll and 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();
}

Upvotes: 1

Mats Petersson
Mats Petersson

Reputation: 129524

Perhaps not a true answer, but for MOST things, running 32-bit code on a 64-bit system works absolutely fine. Of course, it may run a little slower, but compared to having to deal with (and thoroughly test) two different binaries, unless it's significant performance benefits in 64-bit mode (or your application uses more than around 2GB of memory space), I'd be very tempted to use 32-bit mode.

Upvotes: 2

Sebastian Redl
Sebastian Redl

Reputation: 72063

MacOS supports something called "fat binaries", where the program is compiled twice and both versions are packed into a single file. The OS decides which version to actually launch.

Windows doesn't have anything like it.

Upvotes: 1

Joel Lucsy
Joel Lucsy

Reputation: 8706

AnyCPU refers to .Net programs, not C++. C++ must compile down to native, either x86 or x64. You could build 64 bit program and bundle it into your 32 program, extracting it at runtime. This technique is used by ProcessExplorer.

Upvotes: 2

Bathsheba
Bathsheba

Reputation: 234865

No it is absolutely not. You need to define separate executables.

The "Any CPU" dropdown is there to allow you to set compiler settings for more than one platform (e.g. a _DEBUG processor for x64 and Win32) You cannot actually build to that target.

Upvotes: 2

Related Questions