cl.exe 的/Gm参数

    From: xuyibo.org  Updated: 2021-05-09

    邮件通知当更新时自动发送邮件通知。
    评论本文有什么建议或评论,可以贴一下。
    我要捐助你的支持,让我们做的更好。

    /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参数,即使不要,也要保证行为可控。

  1. 相关文章
  2. VC++ Minimum Rebuild Dependency File
    VC2003/VC2008编译器性能
    Visual C++生成调试信息(转)
    VC2005编译器堆栈检查汇编码
    C++学习笔记
    弗莱克斯编辑器 – FlexEdit

  3. 评论本文:
  4. EMail: