在C++文件中的特定預處理器的#define,我有一個這樣的代碼:的msbuild:設置在命令行
#if ACTIVATE
# pragma message("Activated")
#else
# pragma message("Not Activated")
#endif
我想設置這個ACTIVE限定爲1與MSBuild的命令行。
它試過,但它不工作:
msbuild /p:DefineConstants="ACTIVATE=1"
任何想法?
在C++文件中的特定預處理器的#define,我有一個這樣的代碼:的msbuild:設置在命令行
#if ACTIVATE
# pragma message("Activated")
#else
# pragma message("Not Activated")
#endif
我想設置這個ACTIVE限定爲1與MSBuild的命令行。
它試過,但它不工作:
msbuild /p:DefineConstants="ACTIVATE=1"
任何想法?
答案是:你不能
我想你想:
/p:DefineConstants=ACTIVATE
這也許應該是:
#ifdef ACTIVATE
# pragma message("Activated")
#else
# pragma message("Not Activated")
#endif
@ rdeml - 好主意。 – 2008-10-03 12:10:06
C++項目(和解決方案)不(沒?)集成到MSBuild的環境。作爲構建過程的一部分,調用VCBuild task,這只是圍繞vcbuild.exe的一個包裝。
,你可以:
ACTIVATE=1
將被定義一個特定的配置,並與devenv.exe編譯它(與/ProjectConfig開關)。請注意,您的解決方案不適用於C#項目,除非您調整了一些項目文件。作爲參考,這裏是我會怎麼做:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
:<PropertyGroup Condition=" '$(MyConstants)' != '' "> <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants> </PropertyGroup>
msbuild /p:MyConstants="ACTIVATE=1"
我也需要這樣做 - 需要能夠構建兩個不同版本的應用程序,並希望能夠使用VCBUILD編寫腳本。 VCBUILD確實有/ override命令行開關,但我不確定它可以用來修改#define符號,然後可以使用#if條件編譯進行測試。
我想到的解決方案是編寫一個簡單的實用程序來創建一個頭文件,該頭文件根據環境變量的狀態定義該符號,並從預生成步驟運行該實用程序。在每次執行VCBUILD步驟之前,腳本設置環境變量並「觸摸」應用程序中的文件,以確保執行預構建步驟。
是的,這是一個醜陋的黑客,但它是我能想到的最好的!
我對聚會有點遲到(只有4年左右),但我只是在項目上解決了這個問題,並在尋找解決方案時偶然發現了這個問題。我們的解決方案是將一個環境變量與Visual Studio中的Additional Options框結合使用。
套裝>集ExternalCompilerOptions =/DFOO/DBAR
C::調用的msbuild
ç之前的環境變量>的msbuild
項目#1的端部這樣看的vcxproj文件:
<ClCompile>
<AdditionalOptions>$(ExternalCompilerOptions) ... </AdditionalOptions>
</ClCompile>
這對我的作品有2010年VS我們的MSBuild開車從不同的生成腳本,所以醜是隱藏了一下。請注意,當您需要將定義設置爲特定值(/ DACTIVATE = 1)時,我尚未測試此方法是否有效。我認爲它會起作用,但我擔心在那裏有多個'='。
H^2
如果您需要定義一些常量(不只是真/假),你可以做以下的方法:
在命令行:
MSBuild /p:MyDefine=MyValue
在vcxproj文件(在第<ClCompile>和/或<ResourceCompile>,這取決於你需要它):
<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions>
對於VS2010及更高版本,請參閱我的回答here,以獲取不需要修改原始項目文件的解決方案。
正如@ bigh_29所提到的,使用環境變量來定義或取消定義預處理器。
他建議的取消定義預處理器的方法實際上是/U ACTIVATE。
這樣,任何匹配ACTIVATE的預處理器都將被取消,編譯器將不會通過#if ACTIVATE #endif機箱。
也許回答這樣的老問題是一個壞主意,但最近我搜索了一個類似的問題,發現了這個話題。我爲一些構建系統編寫了一個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建議使用數字符號
@馬特,我建議同樣的答案,是由兩位評論者認爲這是行不通告訴我。所以我刪除我的答案,讓其他人用的MSBuild更多的經驗可能會提供意見。 – 2008-10-03 12:07:07
哦,acemtp告訴我他已經試過了,而且確實如此不工作。 – 2008-10-03 12:07:46
那麼它在C#中工作正常... – 2008-10-03 12:16:08