1.前言
上一篇文章已经讲解过.vcxproj文件和.props文件的结构、内容布局及元素作用,现在就实际应用做介绍。
2.应用
2.1.概述
前面说过,官方不建议我们直接修改.vcxproj文件,但是提供了一条其他的入口,即用户可以创建和编辑自己的.props文件,然后在.vcxproj文件中import进来即可,这样有两个好处,
- 为用户提供了一种便利,因为有时候修改项目文件(直接或通过.props、.targets文件)会更直观和方便,当然前提是你得需要了解项目文件的结构和元素作用,可以参考上一篇文章;
- 将独立于具体项目的项目文件内容抽象出来并根据类别形成一个个.props文件,这样可以在不同的项目中复用,比如用户定义的宏、第三方库相关的配置等;
2.2.示例
2.2.1.基础内容布局
下面的xml片段是一个最小的.props文件布局,它和.vcxproj文件很接近;上一篇文章还讲述了如何快速的获取已有的.props文件,这样在其基础上编辑即可得到自己的.props文件。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup />
</Project>
在此基础上,我们开始编辑和扩展吧。
2.2.2.import其他.props文件
在Label为PropertySheets的ImportGroup元素中,可以import进来其他的.props文件,没错,.props文件是可以嵌套引用的,
<ImportGroup Label="PropertySheets">
<Import Project="Versions.props" />
</ImportGroup>
2.2.3.自定义宏
在Label为UserMacros的PropertyGroup元素中,可以自定义宏,
<PropertyGroup Label="UserMacros">
<EXAMROOTDIR>$(SolutionDir)..\</EXAMROOTDIR>
<EXAMBinDir>$(EXAMROOTDIR)output\bin\$(Configuration)\$(Platform)\</EXAMBinDir>
<EXAMLibDir>$(EXAMROOTDIR)output\lib\$(Configuration)\$(Platform)\</EXAMLibDir>
<EXAMIntDir>$(EXAMROOTDIR)output\int\$(Configuration)\$(Platform)\$(ProjectName)\</EXAMIntDir>
<EXAM3RDPARTY>$(EXAMROOTDIR)..\3rdparty\</EXAM3RDPARTY>
</PropertyGroup>
2.2.4.项目级配置
上一篇文章讲述过没有标签的PropertyGroup的作用,是项目级别的配置,编译和生成相关的自定义元数据可以定义在这里;此元素出现在<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
之后,
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<_PropertySheetDisplayName>Base Properties</_PropertySheetDisplayName>
<OutDir>$(EXAMBinDir)</OutDir>
<IntDir>$(EXAMIntDir)</IntDir>
<TargetName>$(ProjectName)</TargetName>
<LinkIncremental>false</LinkIncremental>
<GenerateManifest>true</GenerateManifest>
</PropertyGroup>
2.2.5.条目定义
ItemDefinitionGroup元素包含条目定义,当然遵循一定的规则,参阅上一篇博客;
比如这里可以定义第三方库相关的额外包含目录、额外库目录及额外库。
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(EXAM3RDPARTY);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
2.2.6.ItemGroup
可以设置环境变量,
<ItemGroup>
<BuildMacro Include="EXAMROOTDIR">
<Value>$(EXAMROOTDIR)</Value>
</BuildMacro>
<BuildMacro Include="EXAMIntDir">
<Value>$(EXAMIntDir)</Value>
</BuildMacro>
<BuildMacro Include="EXAMBinDir">
<Value>$(EXAMBinDir)</Value>
</BuildMacro>
<BuildMacro Include="EXAM3RDPARTY">
<Value>$(EXAM3RDPARTY)</Value>
</BuildMacro>
</ItemGroup>
https://stackoverflow.com/questions/4249844/visual-studio-custom-project-variables
2.2.7.示例文件
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<PythonDir>C:\Python27_64</PythonDir>
<PythonExe>$(PythonDir)\python.exe</PythonExe>
<PythonIncludeDir>$(PythonDir)\include</PythonIncludeDir>
<PythonLibDir>$(PythonDir)\libs</PythonLibDir>
<SCons>$(PythonExe) $(PythonDir)\Scripts\scons.py</SCons>
</PropertyGroup>
<ItemDefinitionGroup />
<ItemGroup>
<BuildMacro Include="PythonDir">
<Value>$(PythonDir)</Value>
<EnvironmentVariable>true</EnvironmentVariable>
</BuildMacro>
<BuildMacro Include="PythonExe">
<Value>$(PythonExe)</Value>
<EnvironmentVariable>true</EnvironmentVariable>
</BuildMacro>
<BuildMacro Include="PythonIncludeDir">
<Value>$(PythonIncludeDir)</Value>
<EnvironmentVariable>true</EnvironmentVariable>
</BuildMacro>
<BuildMacro Include="PythonLibDir">
<Value>$(PythonLibDir)</Value>
<EnvironmentVariable>true</EnvironmentVariable>
</BuildMacro>
<BuildMacro Include="SCons">
<Value>$(SCons)</Value>
<EnvironmentVariable>true</EnvironmentVariable>
</BuildMacro>
</ItemGroup>
</Project>
2.3.在.vcxproj文件中导入.props
用户的.props文件总是在系统属性表(被Microsoft.Cpp.props
包含进来的)之后被import进来,这为了确保用户的能够重写被系统属性表设置的默认值。参见上一篇博客。
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="./Example.props" />
3.总结
- 创建和使用.props文件是非常便利的,可以在多个项目中复用(import即可);
- 要理解.vcxproj文件和.props文件的结构布局和元素功能,这样在编辑时可以合理的利用其提供的便利之处且减少错误的发生;
- 在实际使用时可以按功能对.props文件进行分层,比如version.props和base.props、第三方库相关的.props、项目对应的.props文件,最后在.vcxproj文件中import进来项目对应的.props文件即可;