【问题标题】:how can i compile for windows XP with Visual Studio 2012 from the command prompt如何从命令提示符使用 Visual Studio 2012 编译 Windows XP
【发布时间】:2013-04-18 05:32:02
【问题描述】:

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

\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%

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

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

所以我有两个问题:

  1. 除了执行.bat file 之外,我还必须运行其他一些神奇的配置脚本或环境变量来启用v110_xp 工具集,还是执行.bat 文件来完成完整配置?
  2. 除了尝试将其加载到 XP 系统上之外,是否有其他方法可以确认 .dll 确实针对 XP 系统?

【问题讨论】:

  • 为什么不使用VS构建系统而不是使用古老的nmake?
  • makefile.vc 并不是那么简单。例如,它与 TCL 安装紧密耦合(它说它实际上源自)。我不知道如何将所有这些东西导入 VS build。
  • 我也在寻找一种优雅的方式来使用 VS2012 的 nmake 为 WinXP 编译。我很生气 MS 把事情弄得这么复杂。如果 vcvarsall.bat 允许使用参数来指定目标,那就太容易了。此外,他们提供的步骤甚至不会可靠地工作。我将不得不自己解决 %ProgramFiles% 与 %ProgramFiles(x86)% 的问题。

标签: windows visual-studio-2012


【解决方案1】:

我想出了以下批处理脚本来设置变量。看来,我必须将其包含在我的项目中,以便人们使用 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%"
    )

【讨论】:

  • 我在 VS 2013 中尝试了这种方法/批处理脚本,构建的应用程序在 Windows XP 上运行良好,但有某些警告,例如:1。 windows\v7.1a\include\sal_supp.h(57):警告 C4005:'__useHeader':宏重新定义; C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\sal.h(2886) :请参阅之前对 '__useHeader' 的定义 2. windows\v7.1a\include\specstrings_supp.h(77) :警告C4005:'__on_failure':宏重新定义; C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\sal.h(2896) :请参阅之前的“__on_failure”定义
【解决方案2】:

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

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

【讨论】:

  • 这甚至不是问题的答案,是吗?
猜你喜欢
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多