19

在 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):致命错误 C1083:无法打开包含文件:'my_lib.h'
项目:警告 PRJ0018:未找到以下环境变量:
$(MY_LIB_VERSION)

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

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

(或者,定义一个库版本一次并将其多次用于 AdditionalIncludeDirectories 和 AdditionalLibraryDirectories 的任何其他合理方法也可以。)


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

4

4 回答 4

6

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

我一直在使用的一种解决方法,但只有在您可以在启动 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
于 2009-01-07T11:44:58.723 回答
6

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

如果您想在事件中分配变量,例如......

设置ABC=123

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

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

为了使事情更加复杂,Visual Studio 事件编辑器使用 % 作为转义字符。我注意到从 %D 开始的东西不好,%K、%Z 和 %K 是好的。

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

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

于 2020-04-24T11:51:58.973 回答
5

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

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

于 2009-01-07T13:05:08.920 回答
4

使用 SET 命令设置的环境变量是临时的,并且仅在设置它们的进程的生命周期内持续存在。当进程到期时,它们会立即到期 - 并且不能被其他进程看到。

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

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

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

尝试谷歌搜索环境变量窗口持久化

于 2009-01-07T12:15:18.943 回答