2010-01-06 27 views
16

Çok sayıda makalede Stack Overflow ile ilgili soruları yanıtladım: "Preprocessor tanımlarını MSBuild komut satırından derleyiciye nasıl geçirebilirim?" Ben ile gelebilir her varyasyonu denedimMSBuild.exe ya da/p kabul etmiyor: DefineConstants ne/p: PreprocessorDefinitions

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" 

... ve diğerleri onlarca" ve hepsi bazı varyasyon karşılık verdi. Aynı zamanda PreprocessorDefinitions'ı benzer şekillerde geçersiz kıldım. Ben burada sahip büyük bir oyun projesi ile, hem de yukarıda basit bir komut satırı uygulaması ile bu çalışıyorum

#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; 
} 

: Hepsi aşağıda #Error tetikledi. Visual Studio'nun (bunu 2005 ve 2008 ile görüyorum) yalnızca komut satırında argümanımın uygulanmasını engelleyen bazı varsayılan değerleri bağırsaklarında olduğunu tahmin edebilirim, ancak bu hipotezi destekleyen hiçbir kanıt bulamadım.

Bunu nasıl çalıştırabilirim konusunda herhangi bir fikir var mı? Neden FSM adına iyi ol '-D THING_TO_BE_DEFINED?

cevap

7

MSBuild'i komut satırında çağırıyorsanız, DefineConstants değerini belirtemezsiniz. Ama bir .csproj veya başka bir MSBuild betiği oluşturuyorsanız, bunu belirtebilirsiniz. Çözüm dosyanızı "değiştirmek" için bir msbuild dosyası oluşturursanız, projelerinizi oluştururken bunun değerini belirtin. Örneğin:

<?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> 

Sonra msbuild.exe buid.proj /p:DefineConstants="YourValue;Debug;Trace"

Not komut satırında tırnak kullanımı kullanabilirsiniz.

http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx ile ilgili bir konuda bir süre önce bir blog yazısı yazdım. Eğer İZ & DEBUG sabitleri tanımlamak isterseniz

+2

geliştiricinin bana verdiği .vcproj ile sıkışmış. Hamuru. – Sniggerfardimungus

6

bu çalışması gerekir:

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

Kabul edilen yanıt aslında yanlış./T: Rebuild seçeneğini kullanmazsam, kendi projelerim için DefineConstants'ın göz ardı edildiğini buldum. –

+4

Bu çalışır, ancak mevcut '$ (DefineConstants) değişkenini AVERWRITES - EVERY PROJECT çözümünde! - Sadece ona eklemek istiyorum! – BrainSlugs83

1

tamlığı için bu ben VB.NET için, THING_TO_BE_DEFINED="VALUE WANTED" istediğinde çalıştı ve Msbuild sürüm 3.5.30729.1 bulundu budur, bir toplu iş dosyasında:

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

+1

+1 Çok teşekkür ederim! Dizeleri tanımlamak için çift tırnaklardan nasıl kaçılacağınızı söyleyen tek kişi sizsiniz. – Arnaud

2

(bütün tabii tek bir satırda) Aşağıdaki/p çalışmak için vcxproj için gerekli değişiklik vardır.WIN32;;

< DefineConstants> </DefineConstants < PropertyGroup etiket altında>

= Globaller>

< PreprocessorDefinitions> $ (DefineConstants) koymak _DEBUG ; _CONSOLE; UNIT_TEST_SIM;% (ÖnişlemciDefinitions)

MSBuild/p komut satırından belirtilmediği sürece önişlemcisinden için Globals PropertyGroup gelen DefineConstants gelen değerleri kullanmak gerektiğini bilecek Bu şekilde: DefineConstants = "MY_DEFINE" Ben

İlgili konular