Подтвердить что ты не робот

MSBuild.exe не принимает /p: DefineConstants nor/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 они не придерживались хорошего ol '-D THING_TO_BE_DEFINED?

4b9b3361

Ответ 1

Если вы вызываете MSBuild в командной строке, вы не можете указать значение для DefineConstants. Но если вы создаете .csproj или другой MSBuild script, вы можете указать его. Если вы создаете файл 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.proj /p:DefineConstants="YourValue;Debug;Trace"

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

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

Ответ 2

Если вы хотите определить константы TRACE и DEBUG, это должно работать:

msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE"

Ответ 3

Для полноты, это то, что я нашел, когда я захотел THING_TO_BE_DEFINED="VALUE WANTED", для VB.NET и msbuild версии 3.5.30729.1 в пакетном файле:

@msbuild /t:Rebuild /p:Configuration=Release;Platform="Any CPU";
DefineConstants="THING_TO_BE_DEFINED=\"VALUE WANTED\"" mysln.sln

(все на одной строке, конечно)

Ответ 4

Ниже приведены необходимые изменения для vcxproj для работы /p.

положить < DefineConstants > </ DefineConstants >

под ярлыком PropertyGroup: глобальные >

< PreprocessorDefinitions > $(DefineConstants); WIN32; _DEBUG; _CONSOLE; UNIT_TEST_SIM;% (PreprocessorDefinitions)

Таким образом, MSBuild будет знать, что для препроцессора ему необходимо использовать значения из DefineConstants, которые поступают из PropertyGroup Globals, если только они не указаны из командной строки /p: DefineConstants = "MY_DEFINE"