如何为不同目录层级的Visual Studio项目创建通用属性表?
解决VS C++通用属性表适配不同层级项目的方案
你完全可以只用一份属性表搞定所有项目,核心是利用Visual Studio的内置宏和自定义宏动态定位Boost库路径,不用为每个目录层级单独制作属性表。具体操作如下:
1. 创建通用属性表
在checkout_dir下的统一位置(比如checkout_dir/build/props/,方便团队统一引用)新建一个.props文件,命名为Boost.Common.props。
2. 用动态路径宏定位Boost
在属性表中通过MSBuild的路径函数,先找到git checkout的根目录(checkout_dir),再基于根目录定位Boost,完全规避项目层级差异的问题。推荐两种可靠实现方式:
方式一:基于属性表自身位置(最稳定)
如果属性表放在checkout_dir/build/props/,直接通过属性表目录往上跳一级就能拿到根目录:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <!-- 从属性表目录往上跳一级,得到checkout_dir的绝对路径 --> <CheckoutRoot>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\'))</CheckoutRoot> <!-- 基于根目录定义Boost的根路径 --> <BoostRoot>$(CheckoutRoot)libraries\boost\</BoostRoot> </PropertyGroup> <!-- 配置Boost的包含目录和库目录 --> <ItemDefinitionGroup> <ClCompile> <AdditionalIncludeDirectories>$(BoostRoot)include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <AdditionalLibraryDirectories>$(BoostRoot)lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> </Project>
方式二:基于解决方案目录(适配灵活)
如果不想固定属性表位置,也可以通过解决方案目录动态计算根目录,自动适配不同层级的项目:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <!-- 先尝试从SolutionDir往上跳一级找根目录 --> <CheckoutRoot>$([System.IO.Path]::GetFullPath('$(SolutionDir)..\'))</CheckoutRoot> <!-- 如果找不到libraries文件夹,再往上跳一级(适配测试项目的深层级) --> <CheckoutRoot Condition="!Exists('$(CheckoutRoot)libraries')">$([System.IO.Path]::GetFullPath('$(CheckoutRoot)..\'))</CheckoutRoot> <BoostRoot>$(CheckoutRoot)libraries\boost\</BoostRoot> </PropertyGroup> <!-- 配置Boost的包含目录和库目录 --> <ItemDefinitionGroup> <ClCompile> <AdditionalIncludeDirectories>$(BoostRoot)include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <AdditionalLibraryDirectories>$(BoostRoot)lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> </Project>
3. 所有项目统一引用属性表
不管是主项目还是测试项目,右键项目→属性→配置属性→常规→点击导入属性表,选择你创建的Boost.Common.props即可。因为路径是动态计算的,不管项目在哪个层级,都能正确定位到Boost库。
额外优化建议
- 可以在属性表中加入Debug/Release模式的库后缀配置,比如
BoostLibSuffix Condition="'$(Configuration)'=='Debug'"-gd",让属性表适配更多场景。 - 把属性表加入git仓库,确保团队所有人使用同一份配置,避免路径不一致的问题。
内容的提问来源于stack exchange,提问作者Tekar
相关产品推荐
相关产品推荐

