cl.exe /Gm参数

来源:互联网 发布:条形码跳转到淘宝店铺 编辑:程序博客网 时间:2024/04/26 03:45

本文转自 徐艺波 http://www.xuyibo.org/article/78.htm

 

在我手头全部资料中,关于VC编译器/Gm参数只有一句话说明:启动最小重新生成,一直也没能理解。在看完徐艺波的这篇文章后才茅塞顿开:

 

/Gm[-] enable minimal rebuild

 

Visual C++的命令行编译器cl.exe从2003版本(也可以更早)添加了/Gm参数,这个参数是用来控制尽可能少的编译cpp文件。当编译拥有上百个source文件的庞大的项目时,如果修改了某个头文件,如何只编译那些include这个头文件的cpp文件,这正是/Gm参数职责。

/Gm参数外,聪明的程序员总能找到其他方式来解决这个需求:makefile、WDK的build。

 

makefile:
windows下的解释makefile的工具叫nmake(你可以理解为牛B的make :-) ),但这个工具只能实现简单的比较:

 

foo.obj : foo.cpp
    cl ...

源码比较少的话,可以手动将include的头文件放在这里面,但很难应用在像样的实际项目中。

 

 

build:
如果你写过windows驱动,一定熟悉build,这个工具也包含/Gm类似功能,但却是用软件实现的,每次编译都会构造一个include列表,里面包含这个c/cpp文件include的所有文件(层层枚举),然后每次编译前比较这个build.dat数据库中FILEDATE和输出exeFILEDATA比较来判断是否需要编译。顺便提一下,这个工具是steve wood写的,早期nt内核成员中唯一不来自DEC的coder,号称当时微软最聪明的guy,其间风花雪月的故事见《show stopper》

 

/Gm很好用,但我发现对于.c文件不好使,每次都重编译,*.idb也生成了,搞不明白vc小组为什么预编译都好使,这个就不行。

实现:
* .idb文件结构和.pdb相同,.idb中保存了编译某个文件的命令行参数和所有导入的文件全路径和时间,当任何一个改变后都会导致编译该.cpp文件。
* Visual C++ GUI界面可以调用某个函数来知道当前工程是否需要编译,你可以用procmon.exe来跟踪.idb文件,查看调用栈,然后上ida来分析,我试图分析但没成功。如果你成功了,麻烦点化一下我

 

将/Gm参数放到FlexBuild中,用了2周,发现有时候莫名其妙跳过了修改文件的编译,编译成功,但运行出错,重新编译修复。故废弃了/Gm参数,即使不要,也要保证行为可控。

 

本文转自 徐艺波 http://www.xuyibo.org/article/78.htm

原创粉丝点击