【问题标题】:Visual Studio Pre build events and batch setVisual Studio 预构建事件和批处理集
【发布时间】:2011-06-01 16:30:11
【问题描述】:

我正在尝试创建调用一个批处理文件,该文件在构建之前设置了一堆环境变量。

批处理文件看起来像这样(它预先自动生成以检测 ATI Stream SDK 或 NVidia CUDA 工具包):

set OCL_LIBS_X86="%ATISTREAMSDKROOT%libs\x86"
set OCL_LIBS_X64="%ATISTREAMSDKROOT%libs\x86_64"
set OCL_INCLUDE="%ATISTREAMSDKROOT%include"

但是,构建的其余部分似乎无法访问这些变量,所以当我尝试在 C/C++>General>Additional include 目录中引用 $(OCL_INCLUDE) 时,它首先会警告我未找到环境变量 $(OCL_INCLUDE),当我尝试包含 CL/cl.hpp 时,编译将失败:

致命错误 C1083:无法打开包含文件:'CL/cl.hpp':没有这样的文件或目录

我知道如果我想从 Visual Studio GUI 访问这些变量,我可以将它们放入注册表,但我真的不想这样做。有没有办法让这些环境变量在预构建事件之后保持不变?我无法直接引用 $(ATISTREAMSDKROOT),因为该项目必须能够为 ATI Stream 和 NVidia Cuda 构建。

【问题讨论】:

    标签: visual-studio-2008 visual-c++ msbuild build-process build-automation


    【解决方案1】:

    预构建事件在它自己的 shell 中执行(VS 生成一个 cmd.exe 进程),因此您对 set 的所有调用都只针对该实例是本地的。 既然您说您的批处理文件是预先生成的,那么实际上不需要使用预构建事件,是吗?因为还有其他方法可以让 VS 访问这些变量:

    与其简单地启动 VS,不如启动一个 shell,调用批处理文件,然后启动 devenv.exe。或者制作一个批处理文件来完成所有这些操作:

    set OCL_LIBS_X86="%ATISTREAMSDKROOT%libs\x86"
    set OCL_LIBS_X64="%ATISTREAMSDKROOT%libs\x86_64"
    set OCL_INCLUDE="%ATISTREAMSDKROOT%include"
    %comspec% /k "%VCINSTALLDIR%\vcvarsall.bat" x86
    devenv.exe
    

    另一种选择:生成包含变量的属性表并让您的项目包含属性表,而不是生成批处理文件。这样你就不用求助于环境变量,它更像是“VS 方式”来处理变量。通过在常规项目设置中设置“继承的项目属性”或将“InheritedPropertySheets=my.vsprops”添加到 vcproj 文件的配置部分来添加文件。属性表文件示例:

    <?xml version="1.0" encoding="Windows-1252"?>
    <VisualStudioPropertySheet
    ProjectType="Visual C++"
    Version="9.00"
    Name="toolkit_selector"
    >
    <UserMacro
        Name="OCL_LIBS_X86"
        Value="$(ATISTREAMSDKROOT)libs\x86"
    />
    <UserMacro
        Name="OCL_INCLUDE"
        Value="$(ATISTREAMSDKROOT)include"
    />
    </VisualStudioPropertySheet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2010-12-01
      • 2018-07-20
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      相关资源
      最近更新 更多