2013-07-29 32 views
2

我很惊讶地发现,显然不可能在资源文件(.rc)中导入C预定义的宏,因为资源编译器无法处理它们。如何在编译时将正确的版本信息注入资源?

我试图把版本信息放在version.h里面,这个版本信息会被构建系统生成/更新。该文件应该包含在resource.rc之内,因此当您构建资源时,您将始终在所有构建的文件中获得相同的版本。

看起来这与RC_INVOKED有关,而且这个bug是http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc--它被封闭为“as-designed”。

我该如何解决这个问题?

是唯一的选项来修补最终的exe文件,以更新版本信息? ...我不希望这样做,并使用更标准的方式。

回答

2

资源编译器可以很好地处理包含和预处理器定义。例如,它并不适用于包含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

或两者的组合。

向您展示的可能性,这里是目前我在做什么使用Git版本控制的所有项目:

  • 每个项目都有一个version.h中#defining只有很短的VRC_FILEDESCRIPTION和VRC_FILEVERSION
  • 有一个主version.h中#defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
  • 项目包括创建一个预生成事件
  • 的MSBuild的预生成事件发生的有趣的东西护理version.res一个.targets文件:我牛逼创建一个新的临时的头文件相结合的另外两个,采取短的git SHA和当前数据并追加,为文件描述字符串,它结束了看起来像

    Foo Dll [12e454re 30/07/2013]

+0

你是对的,我错过了version.h包含另一个打开潘多拉盒子的.h。 – sorin

相关问题