【问题标题】:How to inject the right version information into the resources at compile time?如何在编译时将正确的版本信息注入资源?
【发布时间】:2013-07-29 16:02:44
【问题描述】:

我惊讶地发现,显然不可能在资源文件 (.rc) 中导入 C 预定义宏,因为资源编译器无法处理它们。

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

这似乎与RC_INVOKED 和这个错误http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc 有关——它被关闭为“按设计”。

我该如何解决这个问题?

是否只有修补最终 exe 以更新版本信息的选项? ...我不希望这样做,并为此使用更标准的方式。

【问题讨论】:

    标签: msbuild resourcebundle versioninfo


    【解决方案1】:

    资源编译器可以很好地处理包含和预处理器定义。例如,它不能很好地处理包括 Windows.h 的问题。但是我想不出 任何 充分的理由为什么您需要在资源编译器使用的文件中使用它。只需使用不包含导致警告的任何内容的头文件,然后定义您需要的内容。例如,我们在这里使用的典型版本控制可以做到这一点并且效果很好:有一个 single 主 .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 #定义一个简短的 VRC_FILEDESCRIPTION 和 VRC_FILEVERSION
    • 有一个主版本.h #defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
    • 该项目包含一个 .targets 文件,该文件在预构建事件中创建一个 version.res
    • msbuild prebuild 事件处理了一些有趣的事情:它创建了一个新的临时头文件,结合了其他两个头文件,获取简短的 git SHA 和当前数据并将其附加到文件描述字符串,因此它最终看起来像

      Foo Dll [12e454re 30/07/2013]

    【讨论】:

    • 你说得对,我错过了 version.h 包含另一个正在打开潘多拉魔盒的 .h。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2013-11-09
    • 2017-02-01
    相关资源
    最近更新 更多