MSBuild.exe, не принимающий любого/p:DefineConstants, ни/p:PreprocessorDefinitions

Я был через множество статей о Переполнении стека, которое ответило на вопрос, "Как делают я передаю определения препроцессора компилятору из командной строки MSBuild", и они все ответили некоторым изменением:

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED

Я попробовал каждое изменение, которое я мог придумать:

MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED"
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED"
MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED=1"
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED=1"

... и десятки других. Я также флиртовал с переопределением PreprocessorDefinitions похожими способами. Все они инициировали #error ниже:

#include "stdafx.h"

#if !defined(THING_TO_BE_DEFINED)
#error "THING_TO_BE_DEFINED is not defined"
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

Я пробовал это простым приложением командной строки выше, а также огромным игровым проектом, который я имею здесь. Я могу только предположить, что Visual Studio (вижу, это с 2005 и 2008) имеет некоторый набор по умолчанию глубоко в его кишечнике, который препятствует тому, чтобы мой параметр командной строки был применен, но я нашел, что никакое доказательство не поддерживает эту гипотезу.

Какие-либо идеи о том, как я могу заставить это работать? Почему от имени FSM разве они не придерживались старого доброго-D THING_TO_BE_DEFINED?

20
задан Brian Tompsett - 汤莱恩 27 November 2015 в 13:50
поделиться

1 ответ

Если вы вызываете MSBuild в командной строке, то вы не можете указать значение для DefineConstants. Но если вы собираете .csproj, или другой скрипт MSBuild, то вы можете его указать. Если Вы создаёте msbuild файл для "замены" Вашего файла решения, то Вы можете использовать это значение при сборке Ваших проектов. Например:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- Default value here -->
    <DefineConstants Condition=" '$(DefineConstants)'==''" >DEBUG;TRACE</DefineConstants>
  </PropertyGroup>

  <ItemGroup>
    <Projects Include="one.csproj" />
    <Projects Include="two.csproj" />
  </ItemGroup>

  <Target Name="Build">
    <MSBuild Projects="@(Projects)"
                 Properties="DefineConstants=$(DefineConstants)"/>
  </Target>
</Project>

Тогда Вы можете использовать msbuild.exe buid.project /p:DefineConstants="YourValue;Debug;Trace"

Обратите внимание на использование кавычек в командной строке.

Некоторое время назад я написал статью в блоге о чем-то связанном с этим по адресу http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx.

9
ответ дан 30 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: