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

Pau*_*son 12 windows visual-studio-2003 compilation environment-variables visual-studio

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

set MY_LIB_VERSION=1.0.0
Run Code Online (Sandbox Code Playgroud)

和AdditionalIncludeDirectories有这个:

c:\path\to\library\my_lib_v$(MY_LIB_VERSION)\include
Run Code Online (Sandbox Code Playgroud)

如果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.0dependencies\my_lib在工作副本中调用它.然后项目设置可以参考dependencies\my_lib\include等.升级到版本1.0.1 my_lib只是编辑svn:externals属性的问题 - 代码和项目设置不需要更改.

Tim*_*sch 5

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

我一直在使用的一种变通办法是,创建一个批处理文件来设置必要的环境变量,然后使用适当的解决方案文件启动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
Run Code Online (Sandbox Code Playgroud)


Pau*_*rth 5

您可能想研究这个工具:http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html

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


Ant*_*ert 5

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

如果你想在你的事件中分配变量,比如......

设置 ABC=123

然后你不能使用 $(ABC) 因为 $(ABC) 在它被传递到命令行运行之前被处理。

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

为了进一步复杂化,visual studio 事件编辑器使用 % 作为转义字符。我注意到从 %D 开始的事情很糟糕,%K、%Z 和 %K 是好的。

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

%DESTDIR% 不会因为转义乱码 - 因此将其更改为 %25DESDIR%25 修复它。