在VS2012中编译WinXP兼容的程序

比眉伴天荒 2022-09-18 10:53 392阅读 0赞

 原文:http://www.cnblogs.com/yejianfei/p/3416125.html

 VS2012默认是不兼容Windows XP的,编译链接出来的程序只能在Windows Vista及以上版本的操作系统上运行。可是有时需要在Windows XP上运行,又不得不用VS2012(例如用了C++11的等等)。这时,就犯愁了。没关系,这个问题可以搞定。

  首先,你的VS2012必须升级到Update 3,否则无法编译出WinXP兼容的程序。

在VS2012集成开发环境中

  编译工程时,在VS2012左侧的“解决方案管理器”是单击右键,在右键菜单中单击“属性”,然后在“配置属性”->“常规”的选项中找到“平台工具集”,在下拉菜单中选中“Visual Studio 2012 - Windows XP (v110_xp)”选项,单击“确定”即可。

VS2012 Update 3 的工程属性界面

在命令提示符中

  那么,如果我是在命令行中编译呢?没关系,把这个“Visual Studio 2012 - Windows XP (v110_xp)”选项的命令行参数查出来就行。

  1. 编译参数: /D _USING_V110_SDK71
  2. console子系统链接参数: /SUBSYSTEM:CONSOLE,"5.01"
  3. windows子系统链接参数: /SUBSYSTEM:WINDOWS,"5.01"

知道了这三个参数就行了。

例如编译boost库

在tools\build\v2\engine\build.jam文件中,找到-subsystem console,出现两次,全部改成-subsystem console,”5.01”

然后在tools\build\v2\tools\msvc.jam文件中,在所有import语句之后加上这一行:

  1. DEFINES += _USING_V110_SDK71

再找到这两行:

  1. toolset.flags msvc LINKFLAGS <user-interface>console : /subsystem:console ;
  2. toolset.flags msvc LINKFLAGS <user-interface>gui : /subsystem:windows ;

把/subsystem:console改成/subsystem:console,”5.01”,并把/subsystem:windows改成/subsystem:windows,”5.01”,就可以开始编译了。

例如编译Qt库

在qtbase\mkspecs\win32-msvc2012\qmake.conf文件中找到这两行:

  1. QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
  2. QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS

把QMAKE_LFLAGS_CONSOLE参数中的/SUBSYSTEM:CONSOLE参数改成/SUBSYSTEM:CONSOLE,”5.01”,把QMAKE_LFLAGS_WINDOWS中的/SUBSYSTEM:WINDOWS参数改成/SUBSYSTEM:WINDOWS,”5.01”。

然后再找这两行

  1. QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t-
  2. QMAKE_CXXFLAGS = $$QMAKE_CFLAGS

在QMAKE_CFLAGS和QMAKE_CXXFLAGS中都加上/D _USING_V110_SDK71然后就可以开始编译Qt库了。

微软提供的方法:

http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx

  1. Set the path and environment variables for Visual Studio 2012 command-line builds.
  1. 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%

  2. 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%

  3. Execute CL and Link as you normally would within the command prompt.

I found the easiest way was to edit \Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat add lines to change the LIB, INCLUDE, PATH and CL variables after the defaults were loaded. Boost.Build uses this batch file so you don’t need to make any other changes.

For example here is the new :x86 section

  1. :x86 if not exist "%~dp0bin\vcvars32.bat" goto missing call "%~dp0bin\vcvars32.bat" 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% goto :SetVisualStudioVersion

发表评论

表情:
评论列表 (有 0 条评论,392人围观)

还没有评论,来说两句吧...

相关阅读