为多个项目和配置有效地使用 Visual Studio 项目属性

新手上路,请多包涵

我一直使用内置 GUI 支持的 Visual Studios 来配置我的项目,通常使用属性表,以便多个项目使用一个公共集。

我对此的主要抱怨之一是管理多个项目、配置和平台。如果你只是用主 GUI 做所有事情(右键单击项目 -> 属性),它很快就会变得一团糟,难以维护并且容易出现错误(例如未能正确定义某些宏,或使用错误的运行时库等)。处理不同的人将依赖库放在不同的地方(例如我的都住在“C:\Libs\[C,C++]\[lib-name]\”)的事实,然后经常管理这些库的不同版本同样不同(发布、调试、x86、x64 等)也是一个大问题,因为它使在新系统上设置它的时间大大复杂化,然后存在版本控制问题和保持每个人的路径分开.. .

属性表使这更好一点,但我不能让一张表具有针对不同配置和平台的单独设置(下拉框变灰),导致我有很多表,如果以正确的顺序继承,可以做我想要的( “x86”、“x64”、“debug”、“release”、“common”、“directories”(通过定义像 BoostX86LibDir 这样的用户宏来处理前面提到的依赖问题)等)以及如果继承顺序错误(例如”x64” 和 “debug” 之前的 “common”) 会导致尝试链接不正确的库版本或错误地命名输出等问题…

我想要的是一种处理所有这些分散的依赖关系并设置一组“规则”的方法,这些规则被我在解决方案中的所有项目使用,比如将输出库命名为“mylib-[vc90,vc100]-[x86 ,x64][-d].lib”,而不必为每个单独的项目、配置和平台组合执行所有这些操作,然后使它们全部正确同步。

我知道迁移到创建所需文件的完全不同的系统(如 CMake),但是这会使其他地方的事情变得复杂,因此即使是简单的任务(例如向项目中添加新文件)也需要在其他地方进行额外的更改,这不是我想要的对任何一个都非常满意,除非有一些与 VS2010 集成的东西可以跟踪这些变化。

原文由 Fire Lancer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 745
2 个回答

我刚刚发现了一些我认为不可能的东西(它没有被 GUI 公开),这有助于使属性表更加有用。项目属性文件中许多标签的“条件”属性,它也可以在 .props 文件中使用!

我只是将以下内容放在一起作为测试,效果很好,并且完成了 5 个(通用、x64、x86、调试、发布)单独的属性表的任务!

 <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Label="UserMacros">
    <!--debug suffix-->
    <DebugSuffix Condition="'$(Configuration)'=='Debug'">-d</DebugSuffix>
    <DebugSuffix Condition="'$(Configuration)'!='Debug'"></DebugSuffix>
    <!--platform-->
    <ShortPlatform Condition="'$(Platform)' == 'Win32'">x86</ShortPlatform>
    <ShortPlatform Condition="'$(Platform)' == 'x64'">x64</ShortPlatform>
    <!--toolset-->
    <Toolset Condition="'$(PlatformToolset)' == 'v90'">vc90</Toolset>
    <Toolset Condition="'$(PlatformToolset)' == 'v100'">vc100</Toolset>
  </PropertyGroup>
  <!--target-->
  <PropertyGroup>
    <TargetName>$(ProjectName)-$(Toolset)-$(ShortPlatform)$(DebugSuffix)</TargetName>
  </PropertyGroup>
</Project>

唯一的问题是属性 GUI 无法处理它,使用上述属性表的项目只报告目标的默认继承值,如“$(ProjectName)”。

原文由 Fire Lancer 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您想定义一些对整个解决方案有效的 UserMacros:

  1. 在您的解决方案根文件夹中创建一个 solution-global.props 文件

  2. 在那里定义你的 UserMacros:

    <?xml version="1.0" encoding="utf-8"?>
   <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <PropertyGroup Label="UserMacros" >
       <CommonUtilsDir>$(SolutionDir)Common\Utils\</CommonUtilsDir>
       <DriverBaseDir>$(SolutionDir)Common\DriverBase\</DriverBaseDir>
     </PropertyGroup>
   </Project>

  1. 在您要在其中使用自定义宏的每个 *.vcxproj 文件中插入以下行:

<Import Project="$(SolutionDir)solution-global.props" />

  1. 使用您的自定义宏:

<AdditionalIncludeDirectories>$(CommonUtilsDir)\Source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

适用于VS2015

原文由 Heri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题