Windows XP Targeting with C++ in Visual Studio 2012

Windows XP Targeting with C++ in Visual Studio 2012

Rate This
  • Comments 42

Background

In June, we announced enhanced targeting for Windows XP using the Visual Studio 2012 C++ compiler and libraries. This feature has been included in Visual Studio 2012 Update 1. You can download it from here. The purpose of this article is to provide an overview of the Windows XP targeting experience, the level of C++ runtime support, and noteworthy differences from the default experience shipped in Visual Studio 2012 at RTM.

Windows XP Targeting Experience

In order to target Windows XP, switch from the default v110 toolset to the newly introduced v110_xp toolset inside your project’s property pages. This new platform toolset points to a repackaged version of the Windows 7 SDK shipped in Visual Studio 2010 instead of the Windows 8 SDK, but uses the same Visual Studio 2012 compiler. The v110_xp toolset also sets useful defaults such as a compatible linker subsystem version for downlevel targeting. Only executables built with this platform toolset are supported to run on Windows XP, but those same executables will also run on Vista, Windows 7 and Windows 8. 

C++ Runtime Support

The static and dynamic link libraries for the CRT, ConCRT/PPL, STL, and MFC have been updated in-place to add runtime support for Windows XP and Windows Server 2003. Applications written in C++/CLI which target the .NET Framework 4.0 will also run on Windows XP and Windows Server 2003. For these operating systems, the supported versions are Windows XP SP3 for x86, Windows XP SP2 for x64, and Windows Server 2003 SP2 for both x86 and x64.

Library

v110 (Vista+)

v110 (Store Apps)

v110_xp (XP/2k3+)

CRT

X

X

X

ConCRT/PPL

X

X

X

STL

X

X

X

MFC

X

 

X

ATL

X

X

X

C++ AMP

X

X

 

Differences from Vista+ Targeting

  1. Building HLSL
    Building HLSL with the v110_xp toolset is not enabled by default. To enable HLSL compilation, download the DirectX SDK (June 2010) and set your project’s VC directories manually to point to this SDK, in a similar manner as Visual Studio 2010. For more information, see the “DirectX SDK Does Not Register Include/Library Paths with Visual Studio 2010” section of the DirectX SDK (June 2010) download page.
     
  2. Debugging DirectX
    The Visual Studio 2012 Graphics Debugging experience is not supported when targeting DirectX 9.
     
  3. Static Analysis
    When selecting the v110_xp platform toolset, the static analysis experience is disabled due to incompatibilities between the SAL annotations in the Visual Studio 2012 C++ libraries and the Windows 7 SDK. If static analysis is required, we recommend that you switch the solution to the normal v110 toolset, execute static analysis, and then switch back to v110_xp.
     
  4. Remote Debugging
    The Remote Tools for Visual Studio 2012 do not support remote debugging on an XP client. When debugging on Windows XP is required, it is recommended to use the debuggers of an older version of Visual Studio, such as Visual Studio 2010, for local or remote debugging. This is in line with the Windows Vista experience for Visual Studio 2012 RTM, which is a runtime target but not a remote debugging target.

  5. Process Status APIs
    As with Visual Studio 2012 RTM, applications that target Windows Vista and below while taking a dependency on the process status APIs must set  the PSAPI_VERSION macro to 1.

Targeting from the Command Line

Visual Studio 2012 solutions and projects which have been switched to the v110_xp toolset can be built from the command line using MSBuild or DEVENV without additional steps. 

However, if you wish to use CL and Link directly, additional steps are needed. Note that the steps below may be automated by creating a batch script.

  1. Set the path and environment variables for Visual Studio 2012 command-line builds. 

  2. Set the required SDK paths and compiler flags using the following commands:

    set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE%
    set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH%
    set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB%
    set CL=/D_USING_V110_SDK71_;%CL%

    When targeting x64, set the lib path as follows:
    set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib\x64;%LIB%
     
  3. Specify the correct subsystem and subsystem version for the linker based on the type of application you are building. Applications targeting the x86 version of Windows XP must specify subsystem version 5.01, and applications targeting x64 must specify version 5.02.

    For x86 console applications: 
    set LINK=/SUBSYSTEM:CONSOLE,5.01 %LINK%

    For x64 console applications:
    set LINK=/SUBSYSTEM:CONSOLE,5.02 %LINK%
     
  4. Execute CL and Link as you normally would within the command prompt.

Feedback

As always, we'd love to hear your feedback. Please submit bugs to Visual Studio Connect, and suggestions to Visual Studio UserVoice.

 

  • > This new platform toolset points to a repackaged version of the Windows 7 SDK shipped in Visual Studio 2010 instead of the Windows 8 SDK, but uses the same Visual Studio 2012 compiler.

    does it mean I need to have VS2010 installed to use this ??

  • @WalkingCat: No, the repackaged SDK is included with the update.

  • Is any plan to support C++ AMP for final release, with only CPU fallback on XP ?

  • Out of curiosity, what was the reason for needing to switch to the Windows 7 SDK when building for XP? The compiler is the same and the runtime libraries have been revved to support XP, so I wonder what the blocker was. Using the Windows 7 SDK does mean that it will be more difficult to use Windows 8 functionality from an XP-compatible program, which may be unusual but is possible.

  • Is there any additional C++ language features supported in this update?

  • @Jackson: The update description page (at the bottom of my post) says no. I'm guessing the C++11 out-of-band updates are going to be a separate update to the Visual Studio update (it's not a "Service Pack" any more?), in the same manner as the web team have been releasing their updates through NuGet.

    OT: This is nice, I've got an XP-required project that it will be nice to be able to move to the 2012 compiler, if only for the smarter editing. (Also, I don't have to install 2010 when I wipe my machines sometime later). Having variadic templates & friends will probably be a bigger deal, when that stuff comes through.

    blogs.msdn.com/.../visual-studio-2012-update-1-ctp.aspx

  • WHEN can we expect "the next release of Visual Studio 2012 Update 1"?

  • (Apologies if this is a repost, but I think the ancient MSDN "swallow your post if it wasn't submitted within a few seconds of loading the page" bug is still there, so I'm posting again.)

    It's never been made particularly easy to build EXEs that can run on old versions of Windows while taking advantage of newer APIs as available (at least if you want the compiler to tell you when you accidentally use new APIs/structs/etc. in common code paths), something that I'd love to see Visual Studio improve upon in future versions.

    Forcing the old SDK + tools to be used, and a separate build/project type, when targeting XP is not helping at all. That makes things worse, not better. More complicated, not less.

    Remote debugging tools are also essential for XP targeting, for me. I don't have an XP development machine set up and maintained; I just have XP running in a VM to test on, and if something goes wrong and I need to debug it then I want to use remote debugging, not to have to install Visual Studio + updates + SDKs + all my source + other tools inside the VM. That takes hours, gets in the way of snapshots/rollbacks, makes it harder to test that my binaries don't have accidental dependencies on something installed by Visual Studio, is inconvenient compared to VM on one monitor and VS on another, etc. etc. etc.

    Instead of kludging in a repackaged version of the old runtime + toolset, why can't you fix the new runtime + toolset to work on Windows XP? Is it really that difficult? Maybe it is. But if so then, at least for me, it makes more sense to stick with VS2008 or VS2010 for a couple more years, until XP finally dies in 2014 (yipee), than to mess around with this type of half-baked solution. Sorry.

  • @Leo Davidson, the only difference is the SDK headers and libs, not the CRT/MFC headers and libs, nor the toolset.  The toolset is the same, but the SDK 8.0 doesn't support XP (officially), only the 7.1 SDK does.  

    I got it to work fine with 8.0 SDK and changing the linker settings manually, but this is not a supported (by Microsoft) scenario.

    The redist (runtime, e.g. msvcr110.dll) is the same for all platforms, no separate redist for XP.  

    So all you're getting with the vc110_xp is the 7.1 Windows SDK headers and libs and a few changes to linker subsystems, etc to target XP.   VC2012 MFC, CRT, etc are the same for ALL platforms including XP.

  • Very nice to see promises being kept.

  • Leave it to Microsoft to screw this up.  There's no excuse for introducing a new toolset to handle XP.  If some damn fool broke the SDK headers in Windows 8, (1) said fool should be fired (which will make Mini-MSFT happy), and (2) the headers should be fixed.  The SDK headers are already full of #ifdef's to selectively expose API's based on target OS version.  Shipping the Windows 7 headers is a huge kludge to avoid doing the job properly.

  • @John: that's crappy solution similar to what they have done to produce smaller MFC executable due to ribbons feature that almost noone use. And that's nothing compared to C++/CX junk that was highly unnecessary with clever C++ paradigms that exist today.

    It was pretty funny to read at Pat Brenner's blog how he tried to explain this were sound decisions. :-D

  • @Avery, @Leo:

    The reason we have reintroduced the Windows 7 SDK is that the Windows 8 SDK has officially dropped support for Windows XP and Windows Server 2003. What this means is that the binaries under the “Windows Kits/8.0/bin” directory are no longer guaranteed to generate code that runs on Windows XP/2003. Additionally, the Windows 8 SDK headers and libs may have removed deprecated Windows XP APIs with no mitigation. As @Mike described above, you may choose to target the standard SDK by not switching  to v110_xp. However, if your application compiles and runs we cannot guarantee it will continue to do so in future releases and updates of Visual Studio.

  • "The reason we have reintroduced the Windows 7 SDK is that the Windows 8 SDK has officially dropped support for Windows XP and Windows Server 2003. "

    And your point is?

    Visual Studio 2012 officially dropped support for Windows XP and Windows Server 2003, and then put it back.

  • Greg,

    Could you spell out the linker options required to target XP while using the VC110 toolset? Is the following sufficient?

    (Win32): "/SUBSYSTEM:WINDOWS,5.01"

    (x64): "/SUBSYSTEM:WINDOWS,5.02"

Page 1 of 3 (42 items) 123