2011-04-18 55 views
2

我想有一個條件編譯符號列表,也許是一個表格,其中每個符號都有一個複選框,然後在構建時,編譯中只包含「開啓」的符號。除了在每次編譯之前以編程方式更改項目文件之外,是否還有任何方法可以執動態設置條件編譯符號

+0

你想從VS構建或更確切地說是調用MSBuild(通過命令行)嗎? – Filburt 2011-04-19 10:36:00

回答

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」的屬性爲真,我們將MY_SYMBOL添加到PreprocessorDefinitions。

  • 撰寫MyProperties.xml文件。該文件由Visual Studio用於顯示屬性頁面UI。它將允許用戶將MY_SYMBOL屬性設置爲true/false。 這裏是MyProperties.xml的例子:

<?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 Persistence="UserFile" ItemType="" HasConfigurationCondition="false" />

這裏是some explanations about property pages的鏈接。

埃米爾

+0

我正在編譯一個C#項目,但是謝謝,這是一個讓我開始的好回答。 – ProfK 2011-04-25 14:52:22