在预编译事件中设置环境variables并在编译步骤中使用

在Visual Studio 2003中,我试图在预编译事件中设置一个环境variables,然后在编译步骤中使用这个环境variables,但是这个值似乎没有被传播。 例如,如果预构build事件包含此(直接或在batch file中):

set MY_LIB_VERSION=1.0.0 

和AdditionalIncludeDirectories有这样的:

 c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include 

那么我希望编译工作,如果my_lib_v1.0.0目录存在。 但是,我得到了

 c:\ path \ to \ prog \ my_prog.c(22):致命错误C1083:无法打开包含文件:'my_lib.h'
项目:警告PRJ0018:未find以下环境variables:
 $(MY_LIB_VERSION)

我推断,在预生成事件中设置的环境variables因此没有被传播到编译步骤,但我可能会失去一些东西。

如何在预编译事件中设置环境variables并在编译步骤中使用它?

(另外,任何其他明智的方法定义一个库版本,并多次使用它的AdditionalIncludeDirectories和AdditionalLibraryDirectories也可以做到。)


更新 :我最终以不同的方式解决了我们的问题。 我们使用的是Subversion,并且在项目源代码的dependencies的子目录上设置了svn:externals属性,这样一个项目的签出就会检出<svn_path>\libraries\my_lib_v1.0.0并将其称为dependencies\my_lib工作副本。 然后项目设置可以引用dependencies\my_lib\includedependencies\my_lib\include 。 升级到版本1.0.1的my_lib就是编辑svn:externals属性 – 代码和项目设置不需要改变。

Solutions Collecting From Web of "在预编译事件中设置环境variables并在编译步骤中使用"

您可能想要调查此工具: http : //workspacewhiz.com/SolutionBuildEnvironmentReadme.html

我们一直用它来管理构建环境中的环境变量。

我必须承认,我从来没有试图在预构建步骤中设置环境变量,我可以明白为什么它不一定会工作(运行一个批处理文件很可能会触发一个单独的过程,而你想要操纵父进程的环境)。

我已经使用了一个解决方法,但只有在启动Visual Studio之前确定必要的设置才能工作,就是创建一个批处理文件来设置必要的环境变量,然后用相应的解决方案文件启动Visual Studio。 我已经复制下面这个批处理文件的骨架:

 REM REM Set up VS environment with defaults (this is for 2008) - need to do this first REM call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" REM REM Set the environment variables required by the project REM set BOOST_BASE=C:\Boost\include\boost-1_35 REM REM If you need to manipulate the path, do it here REM REM REM Finally, start VS with the appropriate solution file REM devenv MyProjectWithBoost.sln 

使用SET命令设置的环境变量是临时的,只有在设置它们的过程的生命周期中才是最后一个。 当进程到期时,它们立即失效 – 而其他进程则无法看到它们。

Visual Studio预生成事件是一个单独的过程。 一旦这个过程到期,环境变量就不复存在了。

你确定环境变量是你想要的吗? 你可以通过设置中央网络位置上的文本文件中的值来做到这一点吗?

编辑 :如果你真的想在Windows中持久地改变环境变量,你可以这样做,但是会涉及调用一些Windows API而不是调用SET。 例如http://code.activestate.com/recipes/416087/

尝试使用Google搜索环境变量窗口持续