Wie man bedingt VC6 Ressourcen kompilieren
-
10-07-2019 - |
Frage
in Abhängigkeit von einem Kompilierung-Schalter (Werte sind COMPILE_A
oder COMPILE_B
), die in Form einer envorinment Variable gesetzt ist, möchte ich meine Anwendung mit unterschiedlichen Einstellungen kompilieren, wie Anwendungsname und Splash-Screen.
Ich habe so weit:
-
"Projekt / Einstellungen / C / C ++ / Preprocessor Definitionen" Ich habe
$(COMPILESWITCH)
(Ergebnisse in Befehlszeilenoption/D "$(COMPILESWITCH)"
). -
In stdafx.h kann ich den folgenden Code verwenden, was bedeutet, dass ich korrekt die Präprozessordefinition über die Befehlszeilenparameter definiert:
#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
Aber ich habe die „Bedingung“ Eigenschaft unter „Resource / [Rechtsklick] / Eigenschaften“ bemerkt ... Der Hilfetext sagt dieser:
BedingungBestimmt die Einbeziehung von die Ressource. Zum Beispiel, wenn die Bedingung ist _DEBUG, diese Ressource würde nur im Debug enthalten sein baut.
Das sieht aus wie die elegante Art und Weise, es zu tun, nicht wahr?
Einzelheiten enthält _DEBUG
als Bedingung funktioniert. So wie _DEBUG
über /D _DEBUG
angegeben ist mein $(COMPILESWITCH)
sollte auch funktionieren, oder?
Aus irgendeinem Grund hat es nicht; warum?
Oder gibt es noch andere, bessere Art und Weise zu erreichen, was ich will?
Lösung
Ich glaube, ich gelöst gerade mein Problem ...
Der Ressource-Compiler verwendet seinen eigenen Präprozessor.
Deshalb ist die gleiche Präprozessordefinition unter „Projekt / Einstellungen / Ressourcen / Preprocessor Definitionen“ hinzugefügt werden muss.
Edit: String-Ressourcen
Das oben funktioniert nicht für String-Ressourcen, da sie keine „Bedingung“ Eigenschaft haben ...
Ich wählte die res\<projectname>.rc2
benutzerdefinierte Ressource-Datei zu verwenden, die von dem Ressource-Editor berührt werden nicht.
Der Inhalt sieht wie folgt aus
#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