VC6 리소스를 조건부로 컴파일하는 방법
-
10-07-2019 - |
문제
컴파일 스위치에 따라 (값은 값입니다 COMPILE_A
또는 COMPILE_B
)는 환경 변수의 형태로 설정되어 있으며 응용 프로그램 이름 및 스플래시 화면과 같은 다른 설정으로 응용 프로그램을 컴파일하려고합니다.
나는 이것을 멀리했다 :
"Project / Settings / C / C ++ / Prephocessor 정의"에서 나는 추가
$(COMPILESWITCH)
(명령 줄 옵션이 나타납니다/D "$(COMPILESWITCH)"
).stdafx.h에서는 다음 코드를 사용할 수 있습니다. 즉, 명령 줄 매개 변수를 통해 전처리 정의를 올바르게 정의했음을 의미합니다.
#if defined COMPILE_A
# define IDB_SPLASH IDB_SPLASH_A
# elif defined COMPILE_B
# define IDB_SPLASH IDB_SPLASH_B
# else
# error Unknown or undefined target compile switch; cannot compile!
# endif
그러나 "ResourceView / [마우스 오른쪽 버튼 클릭] / 속성"아래의 "조건"속성을 발견했습니다 ... 도움말 텍스트는 다음과 같습니다.
상태자원의 포함을 결정합니다. 예를 들어, 조건이 _debug 인 경우이 리소스는 디버그 빌드에만 포함됩니다.
이것은 우아한 방법처럼 보입니다.
명시 _DEBUG
조건이 작동합니다. 그래서 _DEBUG
따라서 지정됩니다 /D _DEBUG
나의 $(COMPILESWITCH)
또한 작동해야합니까?
어떤 이유로 든 그렇지 않습니다. 왜요?
아니면 내가 원하는 것을 달성하는 또 다른 더 좋은 방법조차 있습니까?
해결책
방금 내 문제를 해결 한 것 같아요 ...
리소스 컴파일러는 자체 전처리기를 사용합니다.
따라서 "프로젝트 / 설정 / 리소스 / 사전 처리기 정의"에 동일한 전처리 정의가 추가되어야합니다.
편집 : 문자열 자원
위의 내용은 "조건"속성이 없으므로 문자열 리소스에는 효과가 없습니다 ...
나는 사용하기로 결정했다 res\<projectname>.rc2
리소스 편집기가 터치하지 않는 사용자 정의 리소스 파일. 내용은 다음과 같습니다
#if defined(COMPILE_A) STRINGTABLE DISCARDABLE BEGIN IDR_MAINFRAME "AppTitle A" END #else # if defined(COMPILE_B) STRINGTABLE DISCARDABLE BEGIN IDR_MAINFRAME "AppTitle B" END # else # error Compile switch not defined or unknown; cannot compile! # endif #endif