2008-10-03 100 views
15

在C++文件中的特定預處理器的#define,我有一個這樣的代碼:的msbuild:設置在命令行

#if ACTIVATE 
# pragma message("Activated") 
#else 
# pragma message("Not Activated") 
#endif 

我想設置這個ACTIVE限定爲1與MSBuild的命令行。

它試過,但它不工作:

msbuild /p:DefineConstants="ACTIVATE=1" 

任何想法?

回答

-2

答案是:你不能

7

我想你想:

/p:DefineConstants=ACTIVATE 
+1

@馬特,我建議同樣的答案,是由兩位評論者認爲這是行不通告訴我。所以我刪除我的答案,讓其他人用的MSBuild更多的經驗可能會提供意見。 – 2008-10-03 12:07:07

+0

哦,acemtp告訴我他已經試過了,而且確實如此不工作。 – 2008-10-03 12:07:46

+0

那麼它在C#中工作正常... – 2008-10-03 12:16:08

-1

這也許應該是:

#ifdef ACTIVATE 
# pragma message("Activated") 
#else 
# pragma message("Not Activated") 
#endif 
+0

@ rdeml - 好主意。 – 2008-10-03 12:10:06

8

C++項目(和解決方案)不(沒?)集成到MSBuild的環境。作爲構建過程的一部分,調用VCBuild task,這只是圍繞vcbuild.exe的一個包裝。

,你可以:

  • 爲您的解決方案,其中ACTIVATE=1將被定義一個特定的配置,並與devenv.exe編譯它(與/ProjectConfig開關)。
  • 創建自己的目標文件來包裝自己的調用VCBuild task(見覆蓋參數)...
  • 使用vcbuild.exe代替msbuild.exe。 (vcbuild.exe似乎沒有Override參數的等效項)。

請注意,您的解決方案不適用於C#項目,除非您調整了一些項目文件。作爲參考,這裏是我會怎麼做:

  • 呼叫前添加以下代碼到<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup Condition=" '$(MyConstants)' != '' "> 
    <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants> 
</PropertyGroup>
  • 呼叫的MSBuild這樣的:
msbuild /p:MyConstants="ACTIVATE=1"
0

我也需要這樣做 - 需要能夠構建兩個不同版本的應用程序,並希望能夠使用VCBUILD編寫腳本。 VCBUILD確實有/ override命令行開關,但我不確定它可以用來修改#define符號,然後可以使用#if條件編譯進行測試。

我想到的解決方案是編寫一個簡單的實用程序來創建一個頭文件,該頭文件根據環境變量的狀態定義該符號,並從預生成步驟運行該實用程序。在每次執行VCBUILD步驟之前,腳本設置環境變量並「觸摸」應用程序中的文件,以確保執行預構建步驟。

是的,這是一個醜陋的黑客,但它是我能想到的最好的!

23

我對聚會有點遲到(只有4年左右),但我只是在項目上解決了這個問題,並在尋找解決方案時偶然發現了這個問題。我們的解決方案是將一個環境變量與Visual Studio中的Additional Options框結合使用。

  1. 在Visual Studio中,添加一個環境變量宏,$(ExternalCompilerOptions),在其他選項下的項目選項 - > C/C++ - >命令行(記得Debug和Release CONFIGS)
  2. 套裝>集ExternalCompilerOptions =/DFOO/DBAR
    C::調用的msbuild

    ç之前的環境變量>的msbuild

項目#1的端部這樣看的vcxproj文件:

<ClCompile> 
    <AdditionalOptions>$(ExternalCompilerOptions) ... </AdditionalOptions> 
</ClCompile> 

這對我的作品有2010年VS我們的MSBuild開車從不同的生成腳本,所以醜是隱藏了一下。請注意,當您需要將定義設置爲特定值(/ DACTIVATE = 1)時,我尚未測試此方法是否有效。我認爲它會起作用,但我擔心在那裏有多個'='。

H^2

7

如果您需要定義一些常量(不只是真/假),你可以做以下的方法:

在命令行:

MSBuild /p:MyDefine=MyValue 

在vcxproj文件(在第<ClCompile>和/或<ResourceCompile>,這取決於你需要它):

<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions> 
0

對於VS2010及更高版本,請參閱我的回答here,以獲取不需要修改原始項目文件的解決方案。

0

正如@ bigh_29所提到的,使用環境變量來定義或取消定義預處理器。

他建議的取消定義預處理器的方法實際上是/U ACTIVATE。

這樣,任何匹配ACTIVATE的預處理器都將被取消,編譯器將不會通過#if ACTIVATE #endif機箱。

0

也許回答這樣的老問題是一個壞主意,但最近我搜索了一個類似的問題,發現了這個話題。我爲一些構建系統編寫了一個cmd腳本,並且我成功找到了解決方案。我離開這裏的後代(:

據@ acemtp的問題,我的解決辦法是這樣的:

@echo off 

:: it is considered that Visual Studio tools are in the PATH 
if "%1"=="USE_ACTIVATE_MACRO" (
    :: if parameter USE_ACTIVATE_MACRO is passed to script 
    :: the macro ACTIVATE will be defined for the project 
    set CL=/DACTIVATE#1 
) 
call msbuild /t:Rebuild /p:Configuration=Release 

UPD:我試圖用set CL=/DACTIVATE=1,它也工作,但official documentation建議使用數字符號