个比较实用的VS C++版本号自增的实现方式
以前也实现过一次版本号自增,是用Python自动修改rc文件实现的,现在感觉颇多缺陷
所以研究了下别人的做法后自己又重新实现了一遍。
1.定义Version.h头文件
文件内容如下
#pragma once #define _VERTOSTRING(arg) #arg #define VERTOSTRING(arg) _VERTOSTRING(arg) #define VER_MAIN 1 #define VER_SUB 0 #define VER_SUB2 0 #define VER_BUILD 0 #define VER_FULL VER_MAIN.VER_SUB.VER_SUB2.VER_BUILD #define VER_FULL_RC VER_MAIN,VER_SUB,VER_SUB2,VER_BUILD #define STR_VER_FULL _T(VERTOSTRING(VER_FULL)) #define STR_VER_FULL_RC VERTOSTRING(VER_FULL_RC)
这样定义头文件可以比较完善的满足程序需求,当程序中需要取得版本号时,可以使用STR_VER_FULL宏
而在RC中,则使用VER_FULL_RC和STR_VER_FULL_RC
2.修改RC文件
在rc文件中inlucde我们之间定义的Version.h文件
然后使用VER_FULL_RC和STR_VER_FULL_RC替换,如下
///////////////////////////////////////////////////////////////////////////// // // Version // #include "Version.h" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FULL_RC PRODUCTVERSION VER_FULL_RC FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080404b0" BEGIN VALUE "FileDescription", "KooMC" VALUE "FileVersion", STR_VER_FULL_RC VALUE "InternalName", "KooMC" VALUE "LegalCopyright", "Copyright (C) 2011" VALUE "OriginalFilename", "KooMC.exe" VALUE "ProductName", "KooMC" VALUE "ProductVersion", STR_VER_FULL_RC END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 1200 END END
3.编写Python脚本来修改VER_BUILD
Python脚本如下
# coding=gbk __author__ = "coofly" import argparse import re import sys version_header_template = """#pragma once #define _VERTOSTRING(arg) #arg #define VERTOSTRING(arg) _VERTOSTRING(arg) #define VER_MAIN %d #define VER_SUB %d #define VER_SUB2 %d #define VER_BUILD %d #define VER_FULL VER_MAIN.VER_SUB.VER_SUB2.VER_BUILD #define VER_FULL_RC VER_MAIN,VER_SUB,VER_SUB2,VER_BUILD #define STR_VER_FULL _T(VERTOSTRING(VER_FULL)) #define STR_VER_FULL_RC VERTOSTRING(VER_FULL_RC) """ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("header_path", help="头文件路径") args = parser.parse_args() print args.header_path f = open(args.header_path) try: original = f.read() ver_main = int(re.search(r"^#defines+VER_MAINs+(d+)$", original, re.M).group(1)) ver_sub = int(re.search(r"^#defines+VER_SUBs+(d+)$", original, re.M).group(1)) ver_sub2 = int(re.search(r"^#defines+VER_SUB2s+(d+)$", original, re.M).group(1)) ver_build = int(re.search(r"^#defines+VER_BUILDs+(d+)$", original, re.M).group(1)) except re.error: print "解析头文件失败……" sys.exit(0) finally: f.close() print "原版本号:%d.%d.%d.%d" % (ver_main, ver_sub, ver_sub2, ver_build) ver_build += 1 print "新版本号:%d.%d.%d.%d" % (ver_main, ver_sub, ver_sub2, ver_build) new_header = version_header_template % (ver_main, ver_sub, ver_sub2, ver_build) with open(args.header_path, "w") as f: f.write(new_header)
4.在预先生成事件中添加Python脚本的调用
在我现在的项目中,Python脚本被放在Tools目录下,所以我的调用命令是这样的python "$(SolutionDir)Toolsupdate_version.py" "$(ProjectDir)Version.h"
转自 http://www.coofly.com/index.php/archives/22/
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。