2008-10-03 3 views
15

C++ 파일에서 다음과 같은 코드가 있습니다.msbuild : 명령 줄에서 특정 선처리 프로세서 #define 설정

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

이 활성을 msbuild 명령 줄과 함께 1로 설정하려고합니다.

시도했지만 작동하지 않습니다 :

msbuild /p:DefineConstants="ACTIVATE=1" 

어떤 생각?

답변

-2

대답은 다음과 같습니다.

+0

어깨를 으,, 아마도 C++에서는 아니지만 Matt Howells의 대답은 C# 프로젝트로 저에게 도움이되었습니다. C++에서 작동하지 않는 이유를 생각할 수 없습니다. – blak3r

+0

이 대답은 너무 깊어서 나는 그것을 볼 수 없다. –

+0

@ blak3r Matts 대답은 C++에서 작동하지 않으며이 질문은 C++에 관한 것입니다. 그리고 프로젝트 파일이나 다른 외부 파일을 추가로 변경하지 않고도 명령 줄에 플래그를 추가하는 것만으로는 아무 것도 할 수없는 것처럼 보입니다. – Zitrax

7

난 당신이 원하는 생각 :

/p:DefineConstants=ACTIVATE 
+1

@ 매트를 사용, 나는 같은 대답 제안이 작동하지 않는 두 개의 덧글에 의해 들었다. 그래서 나는 내 대답을 삭제. –

+0

를 아, 그리고 acemtp 그는 이미 이걸 시도해 봤다. 작동하지 않습니다. –

+0

글쎄 그것은 C#에서 어쨌든 잘 작동 ... –

-1

그것은 아마해야합니다 :

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

@ rdeml - 좋은 생각. –

+1

아니오 #ifdef가 아니며 #if 어쨌든 #ifdef와 호환되지 않습니다. – acemtp

8

C++ 프로젝트 (및 솔루션) (? 아직)에의 MSBuild 환경에 통합되지 않습니다. 빌드 프로세스의 일부로 VCBuild task이 호출되며 이는 단지 vcbuild.exe의 래퍼입니다. 당신은 할 수

:

  • ACTIVATE=1가 정의 될 솔루션에 대한 특정 구성을 작성하고합니다 (/ProjectConfig 스위치) devenv.exe로 컴파일.
  • 는 (재정의 매개 변수 참조)
  • 사용 vcbuild.exe 대신 MSBuild.exe를을 VCBuild task에 자신의 전화를 포장하는 자신의 목표 파일을 만듭니다. (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

msbuild.exe 대신 vcbuild.exe를 사용할 수 있지만 질문은 같습니다. vcbuild 명령 줄에서 특정 전 처리기를 설정하는 방법은 무엇입니까? – acemtp

+0

맞습니다. 저는 vcbuild.exe에 VCBuild 작업과 동일한 매개 변수 집합이 있다고 잘못 가정했습니다. 답변이 업데이트되었습니다. – Mac

+0

+1 프로젝트 스크립트 패치 – quetzalcoatl

0

이 작업도 필요했습니다. 두 가지 버전의 내 앱을 빌드 할 수 있어야하고 VCBUILD를 사용하여 빌드를 스크립팅 할 수 있어야했습니다. VCBUILD에는/override 명령 줄 스위치가 있지만 #if 조건부 컴파일을 사용하여 테스트 할 수있는 #define 심볼을 수정하는 데 사용할 수 있는지 확신하지 못합니다.

내가 해결할 수있는 해결책은 간단한 유틸리티를 작성하여 환경 변수의 상태를 기반으로 심볼을 정의하고 사전 빌드 단계에서 유틸리티를 실행하는 헤더 파일을 만드는 것입니다. VCBUILD 단계를 수행하기 전에 스크립트는 환경 변수를 설정하고 사전 빌드 단계가 실행되도록 응용 프로그램에서 파일을 "감동"합니다.

네, 못생긴 해킹입니다.하지만 내가 생각해 낼 수있는 최선이었습니다!

23

저는 파티에 약간 늦었습니다 (불과 4 년 정도).하지만 프로젝트에서이 문제를 해결해야했고 솔루션을 검색하는 동안이 질문을 우연히 발견했습니다. 우리의 솔루션은 Visual Studio의 추가 옵션 상자와 결합 된 환경 변수를 사용했습니다. > 명령 행 (디버그를 모두 기억하고 CONFIGS 릴리스)

  • 세트 -

    1. Visual Studio에서, 옵션 -> C/C++ 프로젝트에서 추가 옵션으로, 환경 변수 매크로, $ (ExternalCompilerOptions)를 추가 =/DFOO/DBAR
      C>를 설정 ExternalCompilerOptions : 종래의 MSBuild

      C를 호출하는 환경 변수> MSBuild를

    아이템 # 1 단부 최대 vcxproj 파일에 다음과 같이보고 :

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

    이 우리는 다양한 빌드 스크립트에서 MSBuild를 구동하기 때문에 추가 약간 숨겨져 VS 2010와 함께 나를 위해 작동합니다. 정의 값을 특정 값 (/ DACTIVATE = 1)으로 설정해야하는 경우이 방법이 작동하는지 테스트하지 않았습니다. 나는 그것이 효과가있을 것이라고 생각하지만 여러 개의 '='을 거기에 넣는 것에 대해 걱정하고 있습니다.

    H^2

  • +0

    답장을 보내 주셔서 감사합니다 : – acemtp

    +0

    리소스 파일을 빌드하는 동안 정의를 설정하려면 구성 등록 정보 -> 리소스 -> 명령 줄에서 추가 옵션을 설정하십시오 – Rado

    7

    당신은 몇 가지 상수 (허위/단지 사실이 아니다), 당신은 그것을 다음과 같은 방법으로 할 수있는 정의해야하는 경우 : 명령 행에서

    :

    MSBuild /p:MyDefine=MyValue 
    

    에서을 vcxproj 파일 (<ClCompile> 및/또는 <ResourceCompile>, 필요한 위치에 따라 다름) :

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

    VS2010 이상인 경우 원본 프로젝트 파일을 수정하지 않아도되는 해결책은 내 대답 here을 참조하십시오.

    0

    as @ bigh_29는 환경 변수를 사용하여 전 처리기를 정의하거나 정의 해제합니다.

    그가 전 처리기를 정의 해제하는 방법은 실제로 /U ACTIVATE입니다.

    이렇게하면 ACTIVATE와 일치하는 모든 전 처리기가 무효화되고 컴파일러는 #if ACTIVATE #endif 인클로저를 통과하지 않습니다.

    0

    아마도 이런 오래된 질문에 답하는 것이 좋지 않을 수도 있지만 최근에 비슷한 문제를 봤는데이 주제를 발견했습니다. 일부 시스템을 빌드 할 때 cmd 스크립트를 작성 했으므로 솔루션을 찾는데 성공했습니다.나는 미래 세대 (여기두고 :

    @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를 : @의 acemtp의 문제에 따라

    , 내 솔루션은 다음과 같이 보일 것이다 나는 set CL=/DACTIVATE=1를 사용하려하고 또한 일을하지만, official documentation의 정보는 다음의 제품에 권장 MSBuild에서 더 많은 경험을 다른 사람들이 아이디어를 제공 할 수 있도록 숫자 기호

    관련 문제