2016-10-04 22 views
1

Я пытаюсь скомпилировать файл проекта XML. Проект компилирует один исходный файл, но имеет размер более 11 КБ из-за склонности к дублированию одних и тех же настроек несколько раз. Я пытаюсь перенести параметры исходного файла и поднять их в Configuration PropertyGroup с помощью различных операторов или выражений условий (что их называют XML?).VS не соблюдает настройки конфигурации PropertyGroup

Если я разбор A guide to .vcxproj and .props file structure из MSDN Blogs правильно, мы можем разместить настройки ИИНОЙ группы свойств:

<PropertyGroup Label=“Configuration“ /> 

    <!– This property sheet (directly or via imports) defines the 

    default values for many tool-specific properties such as the 

    compiler’s Optimization, WarningLevel properties, Midl tool’s 

    TypeLibraryName property, etc... 

Однако, когда я просматриваю изменение пути закрытия VS, а затем вновь открыв его модифицированный файл проекта, ни один из настроек не выбран. Visual Studio, похоже, использует свои собственные настройки.

У меня есть несколько вопросов:

  1. Есть ли визуал установки, чтобы сказать ему, чтобы остановить sraying все настройки в каждом исходном файле студии? Нет никакой причины дублировать настройку 175x4 раз для каждого исходного файла, скрещенного в каждую конфигурацию.

  2. Имеет ли Visual Studio утилиту уплотнения, поэтому мне не нужно это делать вручную? Это очень утомительная работа.

  3. Почему Visual Studio не подбирает настройки? Как это исправить?


Вот снимок экрана страницы свойств, которая включает в себя макросы препроцессора. Измененный XML имеет следующее, что не отражено в Visual Studio. Я пробовал с и без ClCompile.

<!-- Debug Configurations --> 
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Release Configuration"> 
    <ClCompile> 
    <PreprocessorDefinitions>CRYPTOPP_DLL_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
    ... 
    </ClCompile>  
</PropertyGroup> 

enter image description here


Вот уплотненный файл проекта. original can be found here. Проект компилирует 1 исходный файл, а его размер более 11 КБ не уплотняется.

Моды начинаются с <!-- All Configurations --> и заканчиваются на <!-- Back to Visual Studio boilerplate -->. Я не закончил поднимать все настройки, но те, которые были выполнены, такие как Макросы препроцессора и Библиотека времени выполнения, не отражены в Visual Studio.

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup Label="ProjectConfigurations"> 
    <ProjectConfiguration Include="Debug|Win32"> 
     <Configuration>Debug</Configuration> 
     <Platform>Win32</Platform> 
    </ProjectConfiguration> 
    <ProjectConfiguration Include="Debug|x64"> 
     <Configuration>Debug</Configuration> 
     <Platform>x64</Platform> 
    </ProjectConfiguration> 
    <ProjectConfiguration Include="Release|Win32"> 
     <Configuration>Release</Configuration> 
     <Platform>Win32</Platform> 
    </ProjectConfiguration> 
    <ProjectConfiguration Include="Release|x64"> 
     <Configuration>Release</Configuration> 
     <Platform>x64</Platform> 
    </ProjectConfiguration> 
    </ItemGroup> 
    <PropertyGroup Label="Globals"> 
    <ProjectGuid>{1974a53a-9863-41c9-886d-b2b8c2fc3c8b}</ProjectGuid> 
    <RootNamespace>dlltest</RootNamespace> 
    <PlatformToolset>v100</PlatformToolset> 
    </PropertyGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 

    <!-- All Configurations --> 
    <PropertyGroup Label="Configuration"> 
    <ConfigurationType>Application</ConfigurationType> 
    <UseOfMfc>false</UseOfMfc> 
    <CharacterSet>MultiByte</CharacterSet> 
    <WholeProgramOptimization>true</WholeProgramOptimization> 
    <OutDir>$(Platform)\DLL_Output\$(Configuration)\</OutDir> 
    <IntDir>$(Platform)\$(ProjectName)\$(Configuration)\</IntDir> 
    <ClCompile> 
     <WarningLevel>Level4</WarningLevel> 
     <CallingConvention>StdCall</CallingConvention> 
     <SuppressStartupBanner>true</SuppressStartupBanner> 
    </ClCompile>  
    </PropertyGroup> 

    <!-- Debug Configurations --> 
    <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Debug Configuration"> 
    <ClCompile> 
     <PreprocessorDefinitions>CRYPTOPP_DLL_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <Optimization>Disabled</Optimization> 
     <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 
     <IntrinsicFunctions>true</IntrinsicFunctions> 
     <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> 
    </ClCompile>  
    </PropertyGroup> 

    <!-- Release Configurations --> 
    <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Release Configuration"> 
    <ClCompile> 
     <PreprocessorDefinitions>NDEBUG;CRYPTOPP_DLL_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <OmitFramePointers>true</OmitFramePointers> 
     <IntrinsicFunctions>true</IntrinsicFunctions> 
     <FunctionLevelLinking>true</FunctionLevelLinking> 
     <RuntimeLibrary>MultiThreaded</RuntimeLibrary> 
    </ClCompile> 
    </PropertyGroup> 

    <!-- X86 Configurations --> 
    <PropertyGroup Condition="'$(Platform)'=='Win32'" Label="X86 Configuration"> 
    <ClCompile> 
     <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> 
    </ClCompile>  
    </PropertyGroup> 

    <!-- X64 Configurations --> 
    <PropertyGroup Condition="'$(Platform)'=='x64'" Label="X64 Configuration"> 
    <ClCompile> 
     <!-- <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> --> 
     <EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet> 
    </ClCompile>  
    </PropertyGroup> 

    <!-- Back to Visual Studio boilerplate --> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> 
    <ImportGroup Label="ExtensionSettings"> 
    </ImportGroup> 
    <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> 
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> 
    </ImportGroup> 
    <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> 
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> 
    </ImportGroup> 
    <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> 
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> 
    </ImportGroup> 
    <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> 
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> 
    </ImportGroup> 
    <PropertyGroup Label="UserMacros" /> 

    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> 
    <ClCompile> 
     <StringPooling>true</StringPooling> 
     <PrecompiledHeader /> 
    </ClCompile> 
    <ResourceCompile> 
     <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <Culture>0x0409</Culture> 
    </ResourceCompile> 
    <Link> 
     <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies> 
     <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories> 
     <GenerateDebugInformation>true</GenerateDebugInformation> 
     <SubSystem>Console</SubSystem> 
    </Link> 
    </ItemDefinitionGroup> 
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> 
    <ClCompile> 
     <StringPooling>true</StringPooling> 
     <PrecompiledHeader /> 
    </ClCompile> 
    <ResourceCompile> 
     <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <Culture>0x0409</Culture> 
    </ResourceCompile> 
    <Link> 
     <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies> 
     <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories> 
     <GenerateDebugInformation>true</GenerateDebugInformation> 
     <SubSystem>Console</SubSystem> 
     <TargetMachine>MachineX64</TargetMachine> 
    </Link> 
    </ItemDefinitionGroup> 
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 
    <ClCompile> 
     <PrecompiledHeader /> 
     <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> 
    </ClCompile> 
    <ResourceCompile> 
     <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <Culture>0x0409</Culture> 
    </ResourceCompile> 
    <Link> 
     <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies> 
     <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories> 
     <GenerateDebugInformation>true</GenerateDebugInformation> 
     <SubSystem>Console</SubSystem> 
    </Link> 
    </ItemDefinitionGroup> 
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> 
    <ClCompile> 
     <PrecompiledHeader /> 
     <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> 
    </ClCompile> 
    <ResourceCompile> 
     <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions> 
     <Culture>0x0409</Culture> 
    </ResourceCompile> 
    <Link> 
     <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies> 
     <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories> 
     <GenerateDebugInformation>true</GenerateDebugInformation> 
     <SubSystem>Console</SubSystem> 
     <TargetMachine>MachineX64</TargetMachine> 
    </Link> 
    </ItemDefinitionGroup> 
    <ItemGroup> 
    <ClCompile Include="dlltest.cpp" /> 
    </ItemGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
    <ImportGroup Label="ExtensionTargets"> 
    </ImportGroup> 
</Project> 

ответ

2

Ваши настройки перезаписываются, потому что вы помещаете их слишком рано в файл. Сделайте то же, что и VS, и положите их после<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />.

обновление своя ошибка; на втором месте, ваши настройки не имеют никакого эффекта, поскольку вы определяете их как свойства. Сделайте то же, что и VS, и определите их в ItemDefinitionGroup вместо PropertyGroup (опять же, в правильном месте в соответствии с правилами оценки msbuild)

Что касается уплотнения: сохраните настройки в отдельных листах свойств и импортируйте их.Если это будет организовано с умом, это позволит вам больше не изменять параметры самого файла проекта (и, следовательно, заполненные VS элементы ItemDefinitionGroups будут пустыми), но вы просто добавите/удалите листы свойств по мере необходимости, а файл проекта - это просто контейнер для файлов источника/заголовка и листов свойств. Если вы импортируете в VS gui (называемый «Property Manager»), они автоматически окажутся в правильном месте, о котором упоминалось ранее, и порядок тоже будет в порядке. Они также могут быть отредактированы в VS через тот же диалог параметров, что и для проекта.

Обратите внимание, что вы можете создать целые иерархии свойств, импортирующих другие, что полезно, чтобы избежать повторения. Например. вместо того, чтобы вручную добавлять Ws2_32.lib в каждую конфигурацию config/platform, вы просто импортируете лист свойств, который делает именно это. Особенно удобно для библиотек, которые имеют разные имена в зависимости от платформы/конфигурации и т. Д. И предположим, что вы создали отдельные стандартные листы свойств для компилятора/компоновщика/... вы можете добавить их в «мастер». Пример:

enter image description here

+0

Благодаря @stijn. * "... поместите их после' ', беря '' прочь, < другие догадки >. Его действительно неудачная Microsoft не документирует этот материал должным образом. Это становится пустой тратой времени с тех пор, как я занял два дня. И я не ближе к настройке 'EnableEnhancedInstructionSet', поэтому код X64 все еще работает медленнее, чем код Win32. – jww

+0

Бьюсь об заклад, Баллмер смеется над своей задницей, сославшись на его бонусные деньги. Я потратил более $ 3000 с 2010 года на четыре версии версий Visual Studio, чтобы гарантировать, что мы поддерживаем его правильно, и я даже не могу получить приличный набор документов за деньги. Вместо этого я должен прийти к Stack Overflow, просящим ответы. Это нелепо. – jww

+0

Заходите на bizspark из Microsoft. Лучшие 0 центов, которые вы (n) когда-либо проводили, чтобы получить все. – Drew