Вопрос

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

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

<Ол>
  • В " Проект / Настройки / C / C ++ / Определения препроцессора " Я добавил $(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 / [щелчок правой кнопкой мыши] / Properties " ... Текст справки гласит:

      Состояние      

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

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

    Указание _DEBUG как условие работает. Так как /D _DEBUG указано через <=>, мой <=> также должен работать, верно?
    По какой-то причине это не так; почему?

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

    Это было полезно?

    Решение

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

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

    Изменить: строковые ресурсы

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

    Я решил использовать 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
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top