如何从命令提示符下使用Visual Studio 2012编译Windows XP

时间:2013-04-18 05:32:03

标签: windows visual-studio-2012

我正在使用外部c库运行 tcl / tk(8.5)以连接到 d2xx USB 库。我正在运行Windows 8并尝试使用VS 2012 Native Tools命令提示符编译库。当我启动命令提示时,我的PWD是:

\Program Files (x86)\Microsoft Visual Studio 11.0\VC

c库(tclftd2xx.c)附带了虚拟工作室的nmake文件,可以正确设置环境以链接到所需的tcl库和d2xx头。

在VS命令窗口中,我将CD转到包含makefile.vc的目录并输入:

  

nmake .....

我得到了我的tclftd2xx.dll。

tclftd2xx.dll calls msvcr110.dll。当这两个都正确地放在/ Tcl / lib中时,它们在我的Windows 8系统以及Vista和Windows 7上运行良好。

但是,在Windows XP上安装时,Windows无法加载tclftd2xx.dll。

我做了一些搜索,发现我必须为v110_xp工具集配置VS2012。链接(http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx)有以下注释:

  

已切换到的Visual Studio 2012解决方案和项目   可以使用MSBuild从命令行构建v110_xp工具集   或DEVENV没有额外的步骤。

     

但是,如果您希望直接使用CL和Link,则需要执行其他步骤   需要。请注意,可以通过创建批处理来自动执行以下步骤   脚本。

我在这里做了什么:

REM set include and path variables
set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE%
set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH%

REM When targeting X86, set the lib path as follows:
set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB%

REM set the compiler options
set CL=/D_USING_V110_SDK71_;%CL%

REM  When targeting x64, set the lib path as follows:
REM  set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib\x64;%LIB%

REM  Specify the correct subsystem and subsystem version for the linker based on the type of
REM  application you are building. Applications targeting the x86 version of Windows XP must specify
REM  subsystem version 5.01, and applications targeting x64 must specify version 5.02.

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

REM  For x64 console applications:
REM  set LINK=/SUBSYSTEM:CONSOLE,5.02 %LINK%

从VS命令行I构建xp版本 1)运行.bat文件 2)nmake .....

我得到的.dll与windows 8的目标dll完全相同。

所以我有两个问题:

  1. 除了执行.bat file之外,是否还需要运行其他魔术配置脚本或环境变量以启用v110_xp工具集,或者执行.bat文件是否执行完整配置?
  2. 有没有办法确认.dll确实是XP系统的目标,而不是试图在XP系统上加载?

2 个答案:

答案 0 :(得分:2)

我想出了以下批处理脚本来设置变量。看来,我必须将这个包含在我的项目中,让人们使用visual studio 2012构建我的代码。

@echo off
goto :start

:check_dir
    if not exist "%~1" (
        echo Directory "%~1" does not exist.
        echo Things may not work as expected.
    )
    goto :eof

:start
    setlocal
    if "%PROCESSOR_ARCHITECTURE%" == "x86" (
        set "ProgramFiles(x86)=%ProgramFiles%"
    )

    set "BINDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Bin"
    set "INCDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Include"
    set "LIBDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib"
    set "SUBSYS=CONSOLE,5.01"

    REM for x64 instead of x86:
    REM set "LIBDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib\x64"
    REM set "SUBSYS=CONSOLE,5.02"

    call :check_dir "%%BINDIR%%"
    call :check_dir "%%INCDIR%%"
    call :check_dir "%%LIBDIR%%"

    endlocal & (
        set "CL=/D_USING_V110_SDK71_;%CL%"
        set "LINK=/SUBSYSTEM:%SUBSYS% %LINK%"
        set "LIB=%LIBDIR%;%LIB%"
        set "PATH=%BINDIR%;%PATH%"
        set "INCLUDE=%INCDIR%;%INCLUDE%"
    )

答案 1 :(得分:0)

您不必同时包含msvcrt和tclftd2xx dll。编译器生成一个清单,该清单将必要的信息提供给运行时加载程序,以说明应加载哪个C ++运行时。您看到的错误是rules.vc文件需要更新以支持较新的编译器。完成此操作后,makefile变量_VC_MANIFEST_EMBED_DLL将设置为将编译器清单文件合并到生成的DLL中所需的命令。

我已经在github上更新了这个项目,所以这应该不再是一个问题了。