• Visual Studio 2010 C++ 属性设置基础


    在 《Visual Studio 2010 C++ 工程文件解读》中提到了C++工程中可以进行用户自定义的属性设置,如何进行属性设置呢?

    下面我们来了解一下 props 文件的基本规则:

    1、在 PropertyGroup 元素中放置子元素就是定义属性,属性的值就是子元素的内容;例如

    <PropertyGroup>
    <OutputDriver>D:</OutputDriver>
    </PropertyGroup>

    定义来一个属性 OutputDriver 值为 D:

    2、定义元素时可以通过条件来让属性定义在特定的条件下起作用,例如:

    <PropertyGroup>
    <SingleFolder Condition="'$(SingleFolder)' == ''">false</SingleFolder>
    </PropertyGroup>

    只有当 SingleFolder 属性没有定义或者定义的值为空时,将 SingleFolder 的属性定义为 false ; 如果属性组中只有一个属性,或者一个属性组中的多个属性有相同的条件,则可以把条件放置到 PropertyGroup 元素中;

    3、条件表达式可以使用 "=="、"!=" 进行判断,也可以对数值进行“>”、“>=”、“<”、“<=”判断,并且可以对目录进行“Exists”和“HasTrailingSlash”判断,同时可以对表达式进行 “!” 或对多个表达式进行 “AND”、“OR”等操作,可以参考 http://msdn.microsoft.com/en-us/library/7szfhaft.aspx  

    4、值的定义可以进行继承,其实就是在原有的值的基础上增加新的值,如下所示:

    <PropertyGroup Condition="Exists('$(ImportFolder)')">
    <LibraryPath>$(ImportFolder);$(LibraryPath)</LibraryPath>
    </PropertyGroup>

    如果属性“ImportFolder”指定的目录存在,那么将该目录增加到“库”的搜索路径中,并且优先级在默认搜索路径的前面;

    5、可以使用 .net 的函数进行判断或者属性值的定义,例如定义解决方案文件所在的驱动器可以使用如下的定义:

    <PropertyGroup Condition="'$(SolutionDriver)' == ''" >
    <SolutionDriver>$([System.IO.Path]::GetPathRoot($(SolutionDir)))</SolutionDriver>
    </PropertyGroup>

    6、可以使用 import 元素导入其他的属性设置文件,例如需要导入一个解决方案同名的属性文件:

    <ImportGroup>
    <Import Project="$(UserRootDir)Microsoft.Cpp.Common.user.props" />
    </ImportGroup>

    说明:UserRootDir 是 C++ 默认属性文件中定义的属性,值为 $(LOCALAPPDATA)MicrosoftMSBuildv4.0

    7、如果导入的属性文件需要在 Visual Studio 2010 的 "属性管理器" (Property Manager)窗口中可以看到,那么在 ImportGroup 元素中增加特定的属性即可,如下所示:

    <ImportGroup Label="PropertySheets">
    <Import Project="$(ProjectPath).props" Condition="Exists('$(ProjectPath).props')" />
    </ImportGroup>

    则如果一个工程文件的目录下存在 .vcxproj.props 将导入该文件,例如工程文件为 MyProj.vcxproj 并且在工程目录下存在 MyProj.vcxproj.props文件则会自动导入文件 MyProj.vcxproj.props 属性文件

    8、如果在 Property Manager 窗口中希望看到的属性文件名称不是文件名,而是自定的名称,那么可以再属性文件中增加一个特定的属性定义来实现,例如:

    <PropertyGroup>
    <_PropertySheetDisplayName>Cpp Common Properties</_PropertySheetDisplayName>
    </PropertyGroup>

    好了,基本规则我们已经掌握了(复杂的可以研究 VS2010 的 props 文件和查看 MSDN),下面来看看编译和链接的选项如何设置:

    1、编译的选项放置在 ItemDefinitionGroup 元素的 ClCompile 子元素中,例如下面的定义:

    复制代码
    <ItemDefinitionGroup>
    <ClCompile>
    <PreprocessorDefinitions>ISF_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    <PrecompiledHeaderFile>ISF/Stable_Headers.h</PrecompiledHeaderFile>
    <PrecompiledHeader>Use</PrecompiledHeader>
    </ClCompile>
    </ItemDefinitionGroup>
    复制代码

    在这个定义中,首先增加来一个宏定义“ISF_BUILD_DLL”,然后是定义预编译头文件的名称“ISF/Stable_Headers.h”,而不是默认的“stdafx.h”,最后定义来预编译头文件的使用规则是“使用预编译头文件”,这就要求所有的C/C++文件必须在最前面包含头文件 “ISF/Stable_Headers.h”,除非在文件上指定不使用预编译头文件;

    2、链接的选项放置在 ItemDefinitionGroup 元素的 Link 子元素中,例如下面的定义:

    <ItemDefinitionGroup>
    <Link>
    <ProgramDatabaseFile>$(SymbolFolder)$(OutputName).pdb</ProgramDatabaseFile>
    <ImportLibrary>$(ImportFolder)$(OutputName).lib</ImportLibrary>
    </Link>
    </ItemDefinitionGroup>

    在这个定义中,指定了输出的私有的 pdb 文件的输出全路径和动态库的导入库的输出全路径;

    3、库的选项放置在 ItemDefinitionGroup 元素的 Lib 子元素中,例如下面的定义:

    <ItemDefinitionGroup>
    <Lib>
    <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
    </Lib>
    </ItemDefinitionGroup>

    定义了静态库生成时的代码生成行为是“连接时代码生成”;

    嗯,到了该结束的时候了,更多的选项还是留待读者自己研究发现吧....

  • 相关阅读:
    [Tyvj模拟赛]运
    [NOIP 2011]聪明的质监员
    暑假集训D10总结
    暑假集训D9总结
    [POI2008]枪战Maf
    [Usaco2007 Open]Fliptile 翻格子游戏
    [bzoj1592] Making the Grade
    学生信息管理系统(增删改查)【代码不完整】
    《程序员修炼之道》第五次读后感
    《程序员修炼之道》第四次读后感
  • 原文地址:https://www.cnblogs.com/johngu/p/8066334.html
Copyright © 2020-2023  润新知