项目开发代码管理中常常遇到这样的需求:根据不同的情况需要对工程代码进行不同的定制(如有时需要加入试用版期限限制,有时需要使用网络狗检测,有时又要改用单机狗检测),这些定制有时是可以通过代码在运行时实现的,但有些则必须在编译时确定。

  一种不好的维护方式是,程序员根据每次版本输出要求,进行一些临时的代码修改,再编译出版本。这样不仅代码维护困难,也造成版本混乱,难以有效控制。

  其实这个问题可以利用预处理宏进行条件编译来轻松解决,同时,利用VC的命令行进行编译,不需打开IDE环境,使得编译快速,结合批处理脚本又可以实现从代码更新(从代码服务器获取新版本)到编译再到安装包制作的自动化流水线。

  这里暂时不详述代码获取及安装包制作的方法,这些都只需参考使用的版本管理工具(如vss、svn)和安装包制作工具的命令行帮助手册即可。

  对于C++的宏和预处理指令相信大家都很了解,如#ifdef #endif 这样的预处理指令在C++代码中是很常见到的,它们的作用通常是根据宏定义或其他条件的不同进行有选择的编译,即条件编译。利用条件编译,可以轻松实现如是否在程序中加入对加密狗的检查的选择:

#ifdef USE_NET_DOG
if (!CheckNetDog())   
return false;
#endif

  有了这样的条件编译的代码,下一步就是宏的定义。宏定义通常在工程设置中进行,如VC中Project property->Configuration Properties->C/C++->Preprocesser->Preprocesser Definitions,在其中添加要定义的宏即可。

  为了不修改工程设置就可以执行不同的条件编译选择,可以为不同的版本输出需求创建不同的编译配置方案(默认的只有Debug和Release),如添加一个使用网络狗的编译配置方案ReleaseWithNetDog,选择从Release方案继承,然后在该方案中添加USE_NET_DOG宏定义。

  接下来就可以根据需要选择不同的编译配置方案编译输出了。使用命令行编译上面新建的配置方案的方法如下:

devenv.exe MySolution.sln /rebuild ReleaseWithNetDog

  对于其他的输出定制需求,也可以用类似的方式实现对应的编译配置方案进行定制编译。一些情况下可能会需要根据实际情况动态指定一些信息,如时间限制版本的到期时间,这无法在编译配置方案中确定,必须在编译时通过命令行或其他方式输入(目前还需要再研究一下:),有清楚的朋友欢迎帮忙。

  在此基础之上,同时利用版本控制工具、安装包制作工具的命令行功能,实现一个集版本获取、工程编译和安装包制作于一体的批处理脚本,就可以实现这一工作的自动化了。

 

PS: VC命令行选项说明参考:http://msdn.microsoft.com/en-us/library/xee0c8y7(v=VS.80)

 

posted on 2011-01-04 11:15  indif  阅读(1081)  评论(0编辑  收藏  举报