我惊讶地发现显然不可能在资源文件 (.rc
) 中导入 C 预定义宏,因为资源编译器无法处理它们。
我试图将版本信息放入将由构建系统生成/更新的version.h
中。该文件应该包含在 resource.rc
中,因此当您构建资源时,您将始终在所有构建的文件中获得相同的版本。
看来这与RC_INVOKED
和这个bug有关http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc -- 作为“按设计”关闭。
如何解决这个问题?
是唯一的选择来修补最终的exe以更新版本信息吗? ...我不想这样做,而是使用更标准的方法。
最佳答案
资源编译器可以很好地处理包含和预处理器定义。例如,它不能很好地处理包含 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=$(VersionMainIninclude) ... 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 预构建事件负责有趣的事情:它创建一个新的临时头文件,结合其他两个文件,获取短 git SHA 和当前数据,并将其附加到文件描述字符串中,这样它就结束了看起来像
Foo Dll [12e454re 30/07/2013]
关于msbuild - 如何在编译时将正确的版本信息注入(inject)到资源中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928728/