在预构建事件中设置环境变量并在编译步骤中使用

时间:2009-01-07 11:33:49

标签: windows visual-studio compilation environment-variables visual-studio-2003

在Visual Studio 2003中,我尝试在预构建事件中设置一个环境变量,然后在编译步骤中使用该变量,但该值似乎没有传播。例如,如果预构建事件包含此内容(直接或在批处理文件中):

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) : fatal error C1083: Cannot open include file: 'my_lib.h'
Project : warning PRJ0018 : The following environment variables were not found:
$(MY_LIB_VERSION)

我推断出预构建事件中设置的环境变量因此没有传播到编译步骤,但我可能会遗漏一些东西。

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

(或者,任何其他明智的方法来定义一个库版本并为AdditionalIncludeDirectories和AdditionalLibraryDirectories多次使用它也会这样做。)


更新:我最终以不同的方式解决了我们的问题。我们正在使用Subversion,并在名为svn:externals的项目源的子目录上设置dependencies属性,这样项目的签出将另外检出<svn_path>\libraries\my_lib_v1.0.0并将其称为dependencies\my_lib 1}}在工作副本中。然后项目设置可以参考dependencies\my_lib\include等。升级到my_lib版本1.0.1只需要编辑svn:externals属性 - 代码和项目设置不需要更改。

4 个答案:

答案 0 :(得分:4)

我必须承认,我从未尝试在预构建步骤中设置环境变量,我可以看到为什么它不一定有效(运行批处理文件最有可能触发一个单独的进程,而你' d想要操纵父进程的环境。)

我一直在使用的解决方法,但只有在启动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

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

比最初提出此问题的时间晚了11年。我正在使用VS 2019

如果要在事件中分配变量,例如...。

设置ABC = 123

然后,您将不能使用$(ABC),因为在将$(ABC)交给命令行运行之前,它已经得到处理。

您必须使用命令行所使用的%ABC%。它不知道$(ABC)是什么,因为只有Visual Studio才能理解。

为了进一步使事情复杂化,Visual Studio事件编辑器使用%作为转义符。我已经注意到以%D开头的东西是不好的,%K,%Z和%K是好的。

显然,您可以将%25用作%的转义符。

%DESTDIR%不会像乱码一样乱码-因此将其更改为%25DESDIR%25即可解决。

答案 3 :(得分:3)

使用SET命令设置的环境变量是临时变量,仅在设置它们的过程的生命周期中持续。它们会在流程到期时立即过期 - 并且其他流程无法看到。

Visual Studio预构建事件是一个单独的过程。一旦该过程到期,环境变量就不再存在。

您确定环境变量是您想要的吗?你能通过在中央网络位置保存的文本文件中设置一个值吗?

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

尝试使用Google搜索environment variable windows persisting