Компилятор ресурсов отлично разбирается с определениями и определениями препроцессора. Это просто плохо справляется с Windows.h, например. Но я не могу думать о любой хорошей причиной, почему вам нужно, что в файле, который потребляется компилятором ресурсов. Просто используйте заголовочный файл, который не содержит ничего, вызывающего предупреждение, и просто определите, что вам нужно. В качестве примера типичных версий мы используем здесь делает это и работает отлично: есть одного мастер .rc файл с, который выглядит примерно так:
#include <winver.h>
#define stringize(x) stringizei(x)
#define stringizei(x) #x
#ifdef VRC_INCLUDE
#include stringize(VRC_INCLUDE)
#endif
#ifdef _WIN32
LANGUAGE 0x9,0x1
#pragma code_page(1252)
#endif
1 VERSIONINFO
FILEVERSION VRC_FILEVERSION
PRODUCTVERSION VRC_PRODUCTVERSION
FILEFLAGSMASK 0x1L
FILEFLAGS VS_FF_DEBUG
FILEOS VOS__WINDOWS32
FILETYPE VRC_FILETYPE
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", stringize(VRC_COMPANYNAME)
VALUE "FileDescription", stringize(VRC_FILEDESCRIPTION)
VALUE "FileVersion", stringize(VRC_FILEVERSION)
VALUE "LegalCopyright", stringize(VRC_COPYRIGHT)
VALUE "InternalName", stringize(VRC_ORIGINALFILENAME)
VALUE "OriginalFilename", stringize(VRC_ORIGINALFILENAME)
VALUE "ProductName", stringize(VRC_PRODUCTNAME)
VALUE "ProductVersion", stringize(VRC_PRODUCTVERSION)
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
Отсюда по возможности в значительной степени неограничен. Либо определить VRC_INCLUDE
к полному пути включаемого файла, содержащего все VRC_...
определения:
rc /d VRC_INCLUDE=$(VersionMainInclude) ... version.rc
или поставить все определения
rc /d VRC_COMPANYNAME=mycompany ... version.rc
или комбинация обоих.
Чтобы показать вам возможности, вот что я сейчас делаю для всех проектов версионированных с мерзавцем:
- каждый проект имеет version.h #defining только короткий VRC_FILEDESCRIPTION и VRC_FILEVERSION
- есть мастер version.h #defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
- проект включает в себя файл .targets, который создает version.res в виде prebuild события
событие MSBuild prebuild заботится о интересных вещах: я т создает новый временный файл заголовка, сочетающий два другие, занимает короткую GIT SHA и текущие данные и добавляет, что для описания файла строки, так что в конечном итоге выглядят как
Foo Dll [12e454re 30/07/2013]
Вы правы, Я пропустил, что версия.h включала еще один .h, который открывал ящик pandora. – sorin