使用rcsid来控制你的库版本

RCS是CVS的前身,详情可见GNU网站 http://www.gnu.org/software/rcs/。RCS版本控制系统的Magic Keywords这一节中说明了rcsid的用法。
在BSD的代码中,一般读者都会发现在很多地方都会出现static char rcsid[] = “$FreeBSD … $”这样的字符串。
通常在BSD的代码中,前几行会有和rcsid字符串差不多的注释字符。和rcsid字符串一样,这些字串都是由CVS自动生成更新的,主要用来保存文件最后更改的时间、作者等信息。在文件首行加个注释很好理解,而将其放在字符串中则是为了在将文件编译为二进制文件之后依然可以保留这些信息。虽然现在BSD的代码都是用CVS管理了,但还是可以看到rcsid这东东。
现实的工程当中,当编译库文件的时候,我们发现系统下的文件已经变得不是很干净,到处是依赖的动态或者静态库的文件,那么,受污染的系统怎么保证编译的可执行文件或者库文件是正确的版本呢?这里rcsid就显得十分重要了。
一般创建个rcsid专有的宏文件rcsid.h,定义如下:


#if defined(NO_RCSID) || defined(lint)
#define RCSID(x) /* empty */
#elif __STDC__
/*
* This function is never called from anywhere, but it calls itself
* recursively only to fool gcc to not generate warnings :-).
*/
static const char *rcsid(const char *);
#define RCSID(x) static const char *rcsid(const char *s) { return rcsid(x); }
#else
#define RCSID(x) static char *rcsid(s) char *s; { return rcsid(x); }
#endif

然后在.cpp文件中引用这个头文件后,只要加入一行
RCSID("$Version: your version information $");

或使用:
static const char rcsid[] = "$Id: " __FILE__ ",v 1.0.0-0 " __DATE__ " " __TIME__ " Cnangel Exp $";

编译成二进制或库后,我们可以使用:
ident <二进制文件或库>

来检测二进制或库是否包含“your version information”的字样,从而确定你的二进制或库文件是正确的。
当然,这种方式也可以直接使用到Linux系统上哟。
在NetBSD中还可以看到__COPYRIGHT,它也有类似的作用,用what可以查看这个字符串。

Categories

,
| | 评论(1)

评论(1)

值得注意的是:在fedora系统上,如果是用优化选项(-O[n]),则会屏蔽rcsid信息;相反,在redhat系统上,如果不使用调试选项(-g),则会屏蔽rcsid信息。

发表评论

June 2011

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

关于此日记

此日记由 Cnangel 发表于 August 9, 2010 2:22 PM

此Blog上的上一篇日记[转贴]周报的逻辑

此Blog上的下一篇日记autoconf讲座一篇

首页归档页可以看到最新的日记和所有日记。

归档

Powered by Movable Type 5.11