Visual Studio中.sln和.vcproj文件中的宏/环境变量

时间:2009-05-08 15:39:11

标签: visual-studio project path solution

我有两个类似的问题:

a)我有一个包含多个项目的解决方案,我希望通过设置一些环境变量/宏来轻松切换项目位置。 作为示例,该项目可以位于 \ SolutionDir \ Dir1 \或\ SolutionDir \ Dir2 \ 所以,我想指定它应该位于\ SolutionDir \ $(Var)中,只需设置变量。

是否有任何以Visual Studio方式构建的内容?

我知道目前只有两个解决方案 - 编辑.sln文件手动/编程以查找此项目并设置正确的路径。

我无法在.sln文件中使用环境变量。

b)我有一个包含资源(.rc和.h)文件的项目。我希望能够通过其他环境变量或宏来设置它们的位置。

像\ ProjectDir \ $(Var2)\ resource.rc

之类的东西

我在属性表上找到了一些有希望的信息,但是当我在.vcproj中的File标签中使用它时,Visual Studio不会扩展宏。

感谢您提出如何解决此问题的任何想法。

此致 维克多

6 个答案:

答案 0 :(得分:21)

只需在相关字段中使用环境变量:

OutputDirectory="$(MyEnvVariableName)\Bin"

一个技巧是每次更改变量时都需要重新启动Visual Studio IDE。

有一篇关于此的MSDN文章:How to: Use Environment Variables in a Build

答案 1 :(得分:19)

我认为我的目标与你相同:我想使用环境变量在解决方案文件(.sln)中找到一些项目,并使用一些环境变量来查找项目中的一些文件。

我找到了一种方法,它对我来说很好(使用Visual Studio 2005): - 使用文本编辑器编辑.sln文件,并使用具有以下语法的环境变量%MyEnvironmentVariable% - 编辑.vcproj文件并使用一些变量替换所需文件的路径,使用以下语法$(MyEnvironmentVariable)。

希望它有所帮助...... 西里尔

答案 2 :(得分:2)

实现b)中描述的最佳方法是使用属性表。也请查看similar question

  

我发现了一些很有希望的信息   属性表,但Visual Studio   我使用时不会扩展宏   它们位于.vcproj中的文件标记中。

我不确定您使用的VS版本。 VS2008允许您定义例如这样的包含目录:“$(OpenCVInclude)\ cxcore \ include”。我用它所有的时间。 OpenCVInclude是属性表中定义的宏。

关于问题a),我认为没有“干净”的方式来做你想要的。作为替代方案,您可以配置管理器:

  • 包含解决方案中的所有项目。
  • 以不同方式命名项目,例如基于OEM。
  • 为每个项目定义解决方案中的发布和调试配置
  • 在“Build-> Configuration Manager”中,您可以选中或取消选中每个配置的“Build”列。检查相关项目的“构建”。

答案 3 :(得分:1)

我不确定你是在构建C ++项目还是构建C#\ VB项目,但是Visual Studio的一个好处就是所有项目都只是MSBuild项目。如果在文本编辑器中编辑项目,您将看到在项目结束时它导入.targets文件。如果你追踪并找到跟随导入,你会发现几乎所有的VS项目都导入了Microsoft.Common.Targets。 Microsoft.Common.Targets导入Custom.Before.Microsoft.Common.Targets。使用此导入,您可以使用自己的自定义操作导入自己的目标文件。

例如,我有一个目标文件,它具有在解决方案中的所有项目中定义的公共属性,以及在每个项目构建结束时处理的自定义后期构建事件。

除了标准版本\ debug之外,使用此扩展方法并在解决方案中创建自定义配置,您应该能够根据需要创建构建配置的复杂。

答案 4 :(得分:0)

(a)中 Cyrille为您的要求提供了一个不错的解决方案。另一种方法是将可更改的设置保存在一个公共位置。请注意,这不适用于* .sln和* .vcproj等非msbuild文件(直到VS 2010)。

项目文件:          ...     $(ChangeableDir)\ foo.cs

Common.targets:              ChangeThis         ...     

但是,我不认为这是一种很好的做事方式。如果您构建的内容之间的差异很大,则应考虑在源代码管理系统中创建分支。 OTOH,如果差异很小 - 例如硬编码字符串 - 那么这会导致你的第二个问题......

(b)中 您描述的资源管理类型与人们将项目本地化为不同语言所面临的问题基本相同。幸运的是,自2005年以来,直接支持内置于Visual Studio中。请查看以前的问题:Localization in Visual Studio 2008

答案 5 :(得分:0)

一种解决方案是在启动 VS 之前设置一些环境变量。在我们的项目中,我们使用如下所示的批处理文件:

SET ROOT=D:/root
SET COMPILER_ROOT=C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE
start "Microsoft Visual Studio 12.0" /D"%COMPILER_ROOT%\" "%COMPILER_ROOT%/devenv.exe" "%ROOT%\trunk\OurSolution.sln"