2017-12-08 19 views
1

내 문제를 설명하기 위해 빈 Qt 프로젝트를 만들었습니다. in pro 파일의이 QMake 코드를 제외하고는 프로젝트에 아무 것도 없습니다. 프로젝트/빌드 구성은 기본값입니다.Q 조건을 준수하지 않고 DEFINE에 추가합니다.

이 Qmake 코드는 항상 $$system() 함수를 실행하지만 "뒤에서"수행합니다. contains(DEFINES, anything)이 항상 true로 평가되고 후속 코드가 실행되는 미스테리 프로세스가 있습니다. 글자 그대로 somethinganything을 사용한 모든 값을 사용할 수 있습니다.

CONFIG(something){ DEFINES+=anything } 
contains(DEFINES, anything){ 
    message(anything!) 
    stdOut=$$system(echo x > test.txt) 
} 
else{ 
    message(nothing!) 
} 

이 실행될 때마다 (난 그냥 QtCreator에 파일을 저장하고있어 BTW을 킥오프 - qmake를 실행 NOT)이 일반 메시지가 나타납니다 :

프로젝트 MESSAGE : 아무것도!

초 후에 test.txt 파일이 프로젝트 디렉토리에 나타납니다.

파일 쓰기를 제어하기위한 조건으로 CONFIG()을 직접 사용하면 홀수가됩니다. 또한, 해당 CONFIG() 줄을 제거하면 이런 일이 발생하지 않습니다.

신비한 백그라운드 프로세스가있는 것 같습니다. 항상 이것을 평가하고 DEFINES+=anything을 실행 한 다음 논리가 무엇이든간에 계속 처리합니다.

프로젝트에 조건부로 소스 파일을 추가하면 파일이 컴파일되지 않은 경우에도 항상 파일 탐색 트리에 나타납니다. 이는 Qt Creator가 조건문을 무시하고 자신의 목적을 위해 QMake를 실행하는 예제입니다. 이 기능이 게임과 동일한 메커니즘입니까?

답변

0

나는 이것을 싸우는 데 낭비했고, 내 질문을 게시 한 직후 대답에 도착했다. 나는 종종 내 문제를 간단하게 설명하는 행위가 그것을 해결하는 방법을 명확히하는 것처럼 보인다고 종종 봅니다!

어쨌든, 나는 내 추측이 후드 아래에서 무슨 일이 일어나고 있는지에 대해 정확하다고 확신합니다. Qt Creator는 정의를 생성하기 위해 모든 조건문을 무시하는 코드 통과를 수행합니다 (사적인 용도로 ...).

하나 개의 솔루션은 값을 정의하지 세트에, 그리고 바로 이런 qmake를 변수를 사용합니다 : 당신은 단지 qmake를 내 후속 조건을 사용해야 할 경우 괜찮

CONFIG(something){ IS_SOMETHING=true } else { IS_SOMETHING=false } 
$$IS_SOMETHING{ 
    message(anything!) 
    stdOut=$$system(echo x > test.txt) 
} 
else{ 
    message(nothing!) 
} 

합니다. 그 약점은, 당신은 당신의 C++에 로직 캐스케이드를 적용하지 않는다는 것입니다. 그래서, 난 더 나은 솔루션을 발견 :

defineReplace(hideFromIdeParser){ return($$1) } 

CONFIG(something){ DEFINES+=$$hideFromIdeParser(anything) } 
contains(DEFINES, anything){ 
    message(anything!) 
    stdOut=$$system(echo x > test.txt) 
} 
else{ 
    message(nothing!) 
} 

분명히, 블랙 파서 기능의 결과를 해결하지 않습니다, 그래서 원하는대로이 트릭은 모든 일을합니다!