http://cloudmail.iteye.com/blog/1391451
生产线上使用的程序往往比当前正在开发的代码库旧,当程序出现bug时,为了可以追踪到程序对应的版本,需要在程序内记录代码库对应的版本号。本文说明怎么在程序内动态获取svn版本号。
1,设置环境变量(可选)
- export RELEASEVERSION="\\\"1.2\\\""
- export BUILDOS="\\\"`uname`\\\""
- export BUILDDATE="\\\"`date +%y%m%d`\\\""
2,在Makefile定义变量(可选)
- -DRELEASEVERSION=$(RELEASEVERSION) -DBUILDOS=$(BUILDOS) -DBUILDDATE=$(BUILDDATE)
3,在C++代码中通过$Id获取svn版本号
- static const char g_pRevision[] __attribute__((used)) = { "$Id: $" };
4,对svnversion.cpp设置svn属性
- svn propset svn:keywords "Id" svnversion.cpp
svn提交后,g_pRevision 自动变成
- static const char g_pRevision[] __attribute__((used)) = { "$Id: svnversion.cpp 922 2012-02-02 13:23:30Z example-username $" };
可以获得svn最后变更的日期、版本号及用户名
5,使用例子:在C++代码中生成程序版本号
- void getVersion(void)
- {
- string strReleaseVersion = "1.1.1";
- #ifdef RELEASEVERSION
- strReleaseVersion = RELEASEVERSION;
- #endif
- string strBuildOS = "Linux";
- #ifdef BUILDOS
- strBuildOS = BUILDOS;
- #endif
- string strBuildDate = "120201";
- #ifdef BUILDDATE
- strBuildDate = BUILDDATE;
- #endif
- std::cout << "Application Version: " << strReleaseVersion << ", OS:" << strBuildOS << ", Date:" << strBuildDate
- << ", svnRevision:" << g_pRevision << std::endl;
- }
关键点:
__attribute__((used))不能去掉,否则 gcc 看到这个变量没人使用,会进行优化,从而去掉。
更多参考:
gcc attribute:http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Variable-Attributes.html
svn 关键字替换:http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html