Как условно скомпилировать ресурсы VC6 - PullRequest
1 голос
/ 12 марта 2009

в зависимости от параметра компиляции (значения COMPILE_A или COMPILE_B), который задан в виде переменной envorinment, я хочу скомпилировать свое приложение с различными настройками, такими как имя приложения и заставка.

Я получил это далеко:

  1. В «Project / Settings / C / C ++ / Определения препроцессора» я добавил $(COMPILESWITCH) (в результате опция командной строки /D "$(COMPILESWITCH)").

  2. В 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

Но я заметил свойство «Condition» в «ResourceView / [правый клик] / Свойства» ... Текст справки гласит:

Состояние

Определяет включение ресурс. Например, если условие _DEBUG, этот ресурс будет включен только в отладке строит.

Это похоже на элегантный способ сделать это, верно?

Указывая _DEBUG как условие работает. Так как _DEBUG указано через /D _DEBUG, мой $(COMPILESWITCH) также должен работать, верно?
По какой-то причине это не так; почему?

Или есть даже другой, лучший способ добиться того, чего я хочу?

1 Ответ

2 голосов
/ 12 марта 2009

Думаю, я только что решил свою проблему ...

Компилятор ресурсов использует собственный препроцессор.
Поэтому то же самое определение препроцессора должно быть добавлено в «Проект / Настройки / Ресурсы / Определения препроцессора».

Редактировать: строковые ресурсы

Вышеприведенное не работает для строковых ресурсов, поскольку они не имеют свойства condition ...

Я решил использовать пользовательский файл ресурсов 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
...