Reputation: 836
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
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
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
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
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
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