Visual Studio 在预生成事件中设置环境变量并在编译步骤中使用

z8dt9xmd  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(250)

在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,并在项目源代码的一个名为dependencies的子目录上设置了svn:externals属性,这样,项目的检出将额外检出<svn_path>\libraries\my_lib_v1.0.0,并在工作副本中将其称为dependencies\my_lib。然后项目设置可以引用dependencies\my_lib\include等。升级到my_lib的1.0.1版本只需要编辑svn:externals属性--不需要更改代码和项目设置。

nkoocmlb

nkoocmlb1#

比最初问这个问题时晚了11年,我使用的是VS 2019

如果您希望在事件中分配变量,如...。
设置ABC=123
那么你就不能使用$(ABC)了,因为$(ABC)是在交给命令行运行之前处理的。
您必须使用命令行中使用的%ABC%。它不知道$(ABC)是什么,因为只有Visual Studio才能理解它。
更复杂的是,Visual Studio事件编辑器使用%作为转义字符。我注意到以%D开头的东西不好,%K,%Z和%K是好的。
显然,您可以使用%25作为%的转义符。
%DESTDIR%不存在,因为转义会混淆它-因此将其更改为%25DESDIR%25可以修复它。

vfh0ocws

vfh0ocws2#

我必须承认,我从来没有尝试过在预构建步骤中设置环境变量,我可以理解为什么它不一定有效(运行批处理文件很可能会触发一个单独的进程,而您希望操作父进程的环境)。
我一直在使用的一种解决方法,但只有当您可以在启动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
wkftcu5l

wkftcu5l3#

您可能需要研究此工具:http://workspacewhiz.com/SolutionBuildEnvironmentReadme.html
我们一直在使用它来管理构建环境中的环境变量。

dw1jzc5e

dw1jzc5e4#

使用SET命令设置的环境变量是临时的,并且只在设置它们的进程的生命周期内持续。当进程过期时,它们立即过期-并且不能被其他进程看到。
Visual Studio预生成事件是一个单独的进程。一旦该进程过期,该环境变量将停止。
你确定环境变量是你想要的吗?你能通过在一个保存在中央网络位置的文本文件中设置一个值来做到这一点吗?

搜索environment variable windows persisting

相关问题