.vcxproj结构格式说明和.props文件用法说明(二)

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

https://docs.microsoft.com/en-us/cpp/code-quality/using-the-cpp-core-guidelines-checkers?view=vs-2019

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文件即可;
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页