33

我有两个类似的问题:

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

在 Visual Studio 中是否有任何构建方式来做到这一点?

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

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

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

像 \ProjectDir\$(Var2)\resource.rc 这样的东西

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

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

问候,维克多

4

6 回答 6

23

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

OutputDirectory="$(MyEnvVariableName)\Bin"

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

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

于 2009-07-14T17:46:59.473 回答
21

我想我的目标和你一样:我想使用环境变量来定位解决方案文件(.sln)中的一些项目,并使用一些环境变量来定位我的项目中的一些文件。

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

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

于 2009-05-26T08:37:57.197 回答
2

实现您在 b) 中描述的最佳方法是使用属性表。也看看这个非常相似的问题

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

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

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

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

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

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

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

于 2014-01-28T04:55:05.803 回答
0

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

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

Common.targets: ChangeThis ...

但是,我不认为这是做事的好方法。如果您正在构建的功能之间的差异很大,您应该考虑在源代码控制系统中创建一个分支。OTOH,如果差异很小 - 例如硬编码字符串 - 那么这会导致您的第二个问题......

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

于 2009-06-06T21:51:22.753 回答
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"
于 2021-07-14T13:12:38.593 回答