我怎么能从命令提示符与Visual Studio 2012的Windows XP编译

我使用外部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。

我做了一些search,发现我必须configurationVS2012 v110_xp工具集。 链接( http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx )有这样的说明:

已经切换到v110_xp工具集的Visual Studio 2012解决scheme和项目可以使用MSBuild或DEVENV从命令行构build而无需其他步骤。

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

我在这里做了什么:

 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命令行构buildXP版本1)运行.bat文件2)nmake …..

我得到一个与Windows 8的目标dll完全相同的.dll。

所以我有两个问题:

  1. 是否还有一些其他的魔术configuration脚本或环境variables我必须运行以启用v110_xp工具集,除了执行.bat file ,还是执行.bat文件做完整的configuration?
  2. 有没有办法确认.dll确实是针对XP系统而不是试图在XP系统上加载的?

我想出了以下批处理脚本来设置变量。 看来,我将不得不包括这与我的项目,让人们用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%" ) 

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

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