【通用】vs2019项目sln、suo、vcxproj、vcxproj.filters、vcxproj.user文件名解析及相关节点属性解析
1.sln 文件 (Solution 文件)
解决方案是在 Visual Studio 中组织项目的结构。 该解决方案将项目的状态信息保留在两个文件中:
.sln 文件
(基于文本的共享)
.suo 文件
(用户特定的二进制解决方案选项)
这里先讲.sln 文件,.sln 文件包含环境用于查找和加载持久化数据的名称/值参数及其引用的项目 VSPackages 的基于文本的信息。 当用户打开解决方案时,环境会循环访问 .sln 文件中的 preSolution
、 Project
和 postSolution
信息,以加载解决方案、解决方案中的项目以及附加到解决方案的任何持久化信息。
1.1 sln 解析
1、.sln* 文件的标头
如下所示:
Microsoft Visual Studio Solution File, Format Version 12.00 //定义文件格式版本的标准标头。
# Visual Studio Version 16//保存此解决方案文件的 Visual Studio 主版本
VisualStudioVersion = 16.0.31613.86//保存解决方案文件的 Visual Studio 的完整版本
MinimumVisualStudioVersion = 10.0.40219.1//最小 (可以打开此解决方案文件的最早) 版 Visual Studio
2、文件正文
//项目类型 GUID 8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942
//项目 GUID 611D88D3-951B-402B-8965-4A055E2E4691
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PublicNews", "PublicNews\PublicNews.vcxproj", "{611D88D3-951B-402B-8965-4A055E2E4691}"
EndProject
//文件的 Global 部分
Global
/*当环境读取标记时 GlobalSection('name') ,它会使用注册表将名称映射到 VSPackage。
注册表项名称应存在于 [HKLM\Application ID Registry Root>\<SolutionPersistence\AggregateGUIDs] 下的注册表中。
键的默认值是写入条目的 VSPackage 的 Package GUID (REG_SZ) 。
*/
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{611D88D3-951B-402B-8965-4A055E2E4691}.Debug|ARM.Build.0 = Debug|ARM
{611D88D3-951B-402B-8965-4A055E2E4691}.Debug|ARM.Deploy.0 = Debug|ARM
{611D88D3-951B-402B-8965-4A055E2E4691}.Release|x86.Build.0 = Release|x86
{611D88D3-951B-402B-8965-4A055E2E4691}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {91E5EFFB-3DD9-4DC6-AFA1-26B6327DEE3D}
EndGlobalSection
EndGlobal
2.suo 文件(解决方案用户选项)
解决方案用户选项 (.suo) 文件包含每用户解决方案选项。解决方案用户选项 (.suo) 文件是以二进制格式存储的结构化存储或复合文件
。 将用户信息保存到流中
,流的名称是用于标识 .suo 文件中信息的键。 解决方案用户选项文件用于存储用户首选项设置,并在 Visual Studio 保存解决方案时自动创建。
3.vcxproj文件( 工程文件)
Visual C++ 项目系统用于 .vcxproj 文件。 它基于 Visual Studio Common Project System
(CPS) ,并提供其他特定于 C++ 的扩展点,以便轻松集成新工具集、生成体系结构和目标平台。
以下代码片段演示了一个极简的 .vcxproj 文件。 Visual Studio 生成的任何 .vcxproj 文件将包含这些顶级 MSBuild 元素。 此外,它们将按此顺序出现,不过它们可能包含每个此类顶级元素的多个副本。 任何 Label 特性只是 Visual Studio 用作编辑标志的任意标记;它们不具备其他功能。
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
<ItemGroup Label="ProjectConfigurations" />
<PropertyGroup Label="Globals" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />
<PropertyGroup Label="Configuration" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings" />
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" />
</Project>
以下部分介绍其中每个元素的用途以及它们如此排序的原因:
Project 元素
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns='http://schemas.microsoft.com/developer/msbuild/2003' >
Project 为根节点。 它表明要使用的 MSBuild 版本以及将文件向 MSBuild.exe 传递时要执行的默认目标。
ProjectConfigurations ItemGroup 元素
<ItemGroup Label="ProjectConfigurations" />
ProjectConfigurations 包含项目配置描述。 例如“Debug|Win32”、“Release|Win32”和“Debug|ARM”等等。 很多项目设置都特定于给定的配置。 例如,你可能想要为发布生成而不是调试生成设置优化属性。
在生成时不使用 ProjectConfigurations 项组。 Visual Studio IDE 需要将其用于加载项目。 可将这个项组移至 .props 文件并导入至 .vcxproj 文件。 但是在这种情况下,如果需要添加或删除配置,则需要手动编辑 .props 文件而无法使用 IDE。
ProjectConfiguration 元素
下面的代码片段演示一个项目配置。 此示例中的配置名称为“Debug|x64”。 项目配置名称必须采用 ( C o n f i g u r a t i o n ) ∣ (Configuration)| (Configuration)∣(Platform) 格式。 ProjectConfiguration 节点可包含两个属性:Configuration 和 Platform。 当配置处于活动状态时,将使用此处指定的值自动设置这些属性。
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
IDE 预期为所有 ProjectConfiguration 项中使用的 Configuration 和 Platform 值的任意组合查找项目配置。 这通常意味着项目可能具有无意义的项目配置以满足此要求。 例如,如果项目具有这些配置:
Debug|Win32
Retail|Win32
Special 32-bit Optimization|Win32
那么即使“Special 32-bit Optimization”对于 x64 是没有意义的,项目还是需要这些配置:
调试|x64
Retail|x64
Special 32-bit Optimization|x64
可以在“解决方案配置管理器”中禁用任何配置的生成和部署命令。
Globals PropertyGroup 元素
<PropertyGroup Label="Globals" />
Globals 包含项目级设置,例如 ProjectGuid、RootNamespace 和 ApplicationType 或 ApplicationTypeRevision。 最后两项通常定义目标操作系统。 一个项目只能针对一个操作系统,因为目前引用和项目项不能有条件。 通常不会在项目文件中的其他位置重写这些属性。 此组与配置无关,通常项目文件中仅存在一个 Globals 组。
Microsoft.Cpp.default.props Import 元素
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />
Microsoft.Cpp.default.props 属性表是 Visual Studio 附带的,且无法修改。 它包含项目的默认设置。 根据 ApplicationType,可能默认值会有所不同。
Configuration PropertyGroup 元素
<PropertyGroup Label="Configuration" />
Configuration 属性组具备附加的配置条件(例如 Condition=“‘
(
C
o
n
f
i
g
u
r
a
t
i
o
n
)
∣
(Configuration)|
(Configuration)∣(Platform)’==‘Debug|Win32’”),并在多个副本中出现(每个配置各一个)。 此属性组承载着为特定配置设置的属性。 配置属性包括 PlatformToolset,并控制 Microsoft.Cpp.props 中的系统属性表所包含的内容。 例如,如果定义 <CharacterSet>Unicode</CharacterSet>
属性,则会包含系统属性表 microsoft.Cpp.unicodesupport.props。 如果检查 Microsoft.Cpp.props,你会看到该行:<Import Condition="'$(CharacterSet)' == 'Unicode'" Project="$(VCTargetsPath)\microsoft.Cpp.unicodesupport.props" />
。
Microsoft.Cpp.props Import 元素
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
Microsoft.Cpp.props 属性表为许多特定于工具的属性(直接或通过导入)定义默认值。 示例包括编译器的优化和警告级别属性、MIDL 工具的 TypeLibraryName 属性,等等。 它还基于紧靠在其前面的属性组中定义的配置属性导入各种系统属性表。
ExtensionSettings ImportGroup 元素
<ImportGroup Label="ExtensionSettings" />
ExtensionSettings 组包含属于生成自定义项的属性表的导入。 生成自定义最多由三个文件定义:.targets 文件、.props 文件和 .xml 文件。 此导入组包含 .props 文件的导入。
PropertySheets ImportGroup 元素
<ImportGroup Label="PropertySheets" />
PropertySheets 组包含用户属性表的导入。 这些导入是在 Visual Studio 中通过属性管理器视图添加的属性表。 这些导入的列出顺序很重要,且会反映在属性管理器中。 项目文件通常包含此类导入组的多个实例,每个项目配置各一个。
UserMacros PropertyGroup 元素
<PropertyGroup Label="UserMacros" />
UserMacros 包含创建为变量的属性,这些属性用于自定义生成过程。 例径定如,可定义将自定义输出路义为 $(CustomOutputPath) 的用户宏,并用它来定义其他变量。 此属性组包含这类属性。 在 Visual Studio 中不会将此组填充到项目文件,因为 Visual C++ 不支持在配置中使用用户宏。 属性表支持用户宏。
按配置 PropertyGroup 元素
<PropertyGroup />
此属性组有多个实例,所有项目配置都各有一个。 每个属性组必须具备一个附加的配置条件。 如果漏掉了任何配置,“项目属性”对话框将不会正常工作。 与前面列出的属性组不同,此属性组没有标签。 此组包含项目配置级别的设置。 这些设置适用于所有属于该特定项组的文件。 在此处初始化生成自定义项定义元数据。
PropertyGroup 必须位于 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
之后,并且在它之前不能存在其他不带标签的 PropertyGroup(否则项目属性的编辑工作将无法正确进行)。
按配置 ItemDefinitionGroup 元素
<ItemDefinitionGroup />
包含项定义。 这些定义必须和无标签的按配置 PropertyGroup 元素遵循同样的条件规则。
ItemGroup 元素
<ItemGroup />
ItemGroup 元素包含项目中的项(源文件等)。 不支持对项目项(也就是根据规则定义被视为项目项的项类型)使用条件。
元数据应具备每个配置的配置条件,即使它们都是一样的。 例如:
<ItemGroup>
<ClCompile Include="stdafx.cpp">
<TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</TreatWarningAsError>
<TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</TreatWarningAsError>
</ClCompile>
</ItemGroup>
Visual Studio C++ 项目系统目前不支持在项目项中使用通配符。
<ItemGroup>
<ClCompile Include="*.cpp"> <!--Error-->
</ItemGroup>
Visual Studio C++ 项目系统目前不支持在项目项中使用宏。
<ItemGroup>
<ClCompile Include="$(IntDir)\generated.cpp"> <!--not guaranteed to work in all scenarios-->
</ItemGroup>
ItemGroup 中指定了引用,且这些引用具有以下限制:
引用不支持条件。
引用元数据不支持条件。
Microsoft.Cpp.targets Import 元素
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
(直接或通过导入)定义 C++ 目标,例如生成、清理等。
ExtensionTargets ImportGroup 元素
<ImportGroup Label="ExtensionTargets" />
此组包含生成自定义项目标文件的导入。
4 vcxproj.filters文件
筛选器 文件 (*.vcxproj.filters) 是位于根项目文件夹中的 MSBuild 格式的 XML
文件。 它指定哪些文件类型进入解决方案资源管理器中的逻辑文件夹。 在下图中 .cpp ,文件位于 “源文件” 节点下。 .h文件位于“头文件”节点下,而 .ico.rc 文件位于“资源文件”下。 此位置由筛选器文件控制。
4.1 示例
以下示例显示前面所示示例的筛选器文件。 其层次结构是扁平的,也就是没有嵌套逻辑文件夹。 UniqueIdentifier
节点是可选的。 它使 Visual Studio 自动化接口能够查找筛选器。 Extensions
也是可选的。 将新文件添加到项目中时,会将其添加到具有匹配文件扩展名的最顶层筛选器。 若要将文件添加到特定筛选器,请右键单击筛选器,然后选择“添加新项”。
包含 ClInclude
节点的 ItemGroup
是在项目首次启动时创建的。 如果要生成自己的 vcxproj 文件,请确保所有项目项在筛选器文件中也有一个条目。 ClInclude 节点中的值会覆盖基于文件扩展名的默认筛选。 使用 Visual Studio 向项目添加新项时,IDE 会在筛选器文件中添加单个文件条目。 如果更改文件的扩展名,筛选器不会自动重新分配。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="MFCApplication1.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MFCApplication1Dlg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="MFCApplication1.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MFCApplication1Dlg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="MFCApplication1.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<None Include="res\MFCApplication1.rc2">
<Filter>Resource Files</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Image Include="res\MFCApplication1.ico">
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
</Project>
若要创建嵌套逻辑文件夹,请声明筛选器 ItemGroup 中的所有节点,如下所示。 每个子节点必须声明指向最顶层父级节点的完整逻辑路径。 在以下示例中,必须声明空 ParentFilter ,因为它在后面的节点中被引用。
<ItemGroup>
<Filter Include="ParentFilter">
</Filter>
<Filter Include="ParentFilter\Source Files"> <!-- Full path to topmost parent.-->
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> <!-- Optional-->
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> <!-- Optional -->
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
</ItemGroup>
5.vcxproj.user文件
用户文件 (.vcxproj.user) 存储特定于用户的属性
,例如调试和部署设置。 vcxproj.user 文件适用于特定用户的所有项目。
例
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>
参考文档:microsoft VS 文档 https://learn.microsoft.com/zh-cn/visualstudio/windows/
更多推荐
所有评论(0)