我想要一个条件编译符号列表,也许是一个表格,其中每个符号都有一个复选框,然后在构建时,只有“切换”的符号才包含在编译中。除了在每次编译之前以编程方式更改项目文件之外,还有什么办法吗?
答案 0 :(得分:3)
首先,我假设您希望从Visual Studio IDE和编译C ++项目中获得此答案。
您可以通过向项目添加属性页来指定所有这些编译符号。属性页面可以轻松地为您提供UI。当用户编辑属性页时,数据存储在项目文件或用户文件中的项/属性中。 您还需要添加一个自定义任务,该任务将实际获取属性页面存储的数据,并在编译文件时应用它。
所以这里有一些细节:
从项目文件中导入目标文件。编辑.vcxproj并在结尾添加(例如在结束元素</Project>
之前),例如:
<Import Project="$(ProjectDir)MyTargets.xml" />
撰写MyTargets.xml文件。它应该导入属性页面并定义自定义目标。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema Include="$(ProjectDir)MyProperties.xml"/>
</ItemGroup>
<Target Name="AddMySymbols"
Inputs="@ClCompile"
Outputs="__non_existent_outputs__"
BeforeTargets="ClCompile">
<ItemGroup>
<ClCompile Include="@ClCompile">
<PreprocessorDefinitions Condition="'$(MY_SYMBOL)'='true'">MY_SYMBOL; %(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemGroup>
</Target>
</Project>
在编译每个文件之前执行AddMySymbols目标。对于每个文件,如果名为“MY_SYMBOL”的属性为true,我们将MY_SYMBOL添加到PreprocessorDefinitions。
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">
<Rule Name="Symbols" PageTemplate="tool" DisplayName="Symbols" SwitchPrefix="/" Order="1" xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Rule.Categories>
<Category Name="MySymbols">
<Category.DisplayName>
<sys:String>My Symbols</sys:String>
</Category.DisplayName>
</Category>
</Rule.Categories>
<Rule.DataSource>
<DataSource Persistence="ProjectFile" ItemType="" HasConfigurationCondition="false" />
</Rule.DataSource>
<BoolProperty
Name="MY_SYMBOL"
Category="MySymbols"
DisplayName="MY_SYMBOL"
Description="When enabled, MY_SYMBOL will be added to preprocessor symbols when compiling C/C++ files."/>
</ProjectSchemaDefinitions>
ItemType为“”,以便MY_SYMBOL将作为属性而不是项目保存在项目文件中。你可以用不同的方式安排它,而不是使用项目。
如果您希望按用户保存符号,可以将DataSource更改为<DataSource Persistence="UserFile" ItemType="" HasConfigurationCondition="false" />
以下是指向some explanations about property pages的链接。
阿米尔