使用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可以查看这个字符串。

Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Entry

This page contains a single entry by Cnangel published on August 9, 2010 2:22 PM.

[转贴]周报的逻辑 was the previous entry in this blog.

autoconf讲座一篇 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.