Windows 在预构建事件中设置环境变量并在编译步骤中使用
在VisualStudio2003中,我试图在预构建事件中设置一个环境变量,然后在编译步骤中使用该变量,但该值似乎没有传播。例如,如果预生成事件包含此内容(直接或在批处理文件中): 此外,包括董事在内的其他董事有:Windows 在预构建事件中设置环境变量并在编译步骤中使用,windows,visual-studio,compilation,environment-variables,visual-studio-2003,Windows,Visual Studio,Compilation,Environment Variables,Visual Studio 2003,在VisualStudio2003中,我试图在预构建事件中设置一个环境变量,然后在编译步骤中使用该变量,但该值似乎没有传播。例如,如果预生成事件包含此内容(直接或在批处理文件中): 此外,包括董事在内的其他董事有: 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 C1
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)
c:\path\to\prog\my_prog.c(22):致命错误C1083:无法打开包含文件:“my_lib.h”
项目:警告PRJ0018:未找到以下环境变量:
$(MY_LIB_版本)
因此,我推断预构建事件中设置的环境变量没有传播到编译步骤,但我可能遗漏了一些内容
如何在预构建事件中设置环境变量并在编译步骤中使用它?
(或者,任何其他合理的方法,一次定义一个库版本,并将其用于其他includedirectories和其他librarydirectories,也可以这样做。)
更新:我最终以不同的方式解决了我们的问题。我们正在使用Subversion,并在名为
dependencies
的项目源子目录上设置svn:externals
属性,这样项目的签出将额外签出\libraries\my_lib_v1.0.0
,并在工作副本中将其称为dependencies\my_lib
。然后项目设置可以引用dependencies\my_lib\include
等类似内容。升级到my_lib
的1.0.1版只需编辑svn:externals
属性,代码和项目设置不需要更改。我必须承认,我从未尝试在预构建步骤中设置环境变量,我可以理解为什么它不一定有效(运行批处理文件很可能会触发一个单独的进程,而您希望操纵父进程的环境)
我一直在使用的一种解决方法是,创建一个批处理文件,设置必要的环境变量,然后使用适当的解决方案文件启动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
尝试谷歌搜索您可能想调查此工具:
我们一直在使用它来管理构建环境中的环境变量。这比最初提出这个问题时晚了11年。我使用的是VS 2019 如果在事件中,您希望在事件中指定变量,如 设置ABC=123 那么您就不能使用$(ABC),因为$(ABC)是在交给命令行运行之前处理的 您必须使用命令行使用的%ABC%。它不知道$(ABC)是什么,因为它只有visual studio才能理解 为了使事情更加复杂,visual studio事件编辑器使用%作为转义字符。我注意到从%D开始的事情不好,%K,%Z和%K都好 显然,您可以使用%25作为%的转义
%DESTDIR%不会因为转义而变得乱七八糟-因此将其更改为%25DESDIR%25可以修复它。感谢您的解决方案。我们会提前知道版本号,但我真的想将其集成到标准版本中,这样无论开发人员使用IDE还是命令行,库版本都将是正确的。我没有权力进行修改整个团队需要使用一个特殊的脚本!我想做的主要事情是有一个库版本的文本文件,并有额外的includedirectories依赖于文本文件中的值,而不需要每个开发人员都记得在编译之前运行一个特殊的脚本。我不确定环境变量是否是我想要的!谢谢。我“我已经安装了外接程序,它对我很有用。但是我不确定我是否能说服我们所有的开发人员自己安装它,因为这必须在公司的每台开发机器上进行,这样才能使整个公司都可靠。看起来像这样的外接程序是编辑Visual Studio自己的环境变量的唯一方法,所以我接受这一点。”nswer,尽管它不是我可以应用于整个公司的东西。这个加载项很棒,据我所知,它是动态添加环境变量的唯一解决方案。但是请注意,包含环境变量的文件上的行不能超过2048个字符(加载项的源代码中有一个丑陋的字符[2048])。从Windows 7开始(看起来如此)有一个命令
SETX
可以持久地存储环境变量。来源:11年后的评论值得一次投票。尽管我无法将预构建事件命令行set
环境变量或调试命令行参数传递给我的Nunit测试项目。我必须这样做。如果问题相同,请标记我是重复的。如果他们不是,花时间针对所问的问题写一个新的答案。
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