MSBuild.exe не принимает ни / p: DefineConstants, ни / p: PreprocessorDefinitions - PullRequest
20 голосов
/ 07 января 2010

Я прочитал довольно много статей о переполнении стека, в которых был дан ответ на вопрос «Как передать определения препроцессора в компилятор из командной строки 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 годах) имеет в своем недрах некий набор по умолчанию, который препятствует применению моего аргумента командной строки, но я не нашел доказательств в поддержку этой гипотезы. 1010 *

Любые идеи о том, как я могу заставить это работать? Почему во имя FSM они не придерживались доброго прошлого THD_TO_BE_DEFINED?

Ответы [ 4 ]

9 голосов
/ 07 января 2010

Если вы вызываете 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.proj /p:DefineConstants="YourValue;Debug;Trace"

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

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

7 голосов
/ 29 декабря 2012

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

msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE"
4 голосов
/ 26 апреля 2015

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

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

в <<strong> PropertyGroup Label = Globals>

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

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

2 голосов
/ 07 февраля 2013

Для полноты, это то, что я нашел работающим, когда я хотел 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

(все на одной линии курса)

...