CMake构建实战:项目开发卷
上QQ阅读APP看书,第一时间看更新

1.2.2 一个需要漫长编译过程的程序

当程序体量逐渐变得庞大,编译时间也会越来越长。C++更是经常因为编译速度慢而被大家诟病。因此,我们在工程上常采取很多手段优化编译时间。其中,最简单直接的手段就是避免不必要的编译。简言之,当多次编译多份源文件时,编译器应当聪明地只把修改过的源程序重新编译,而复用其他未修改的已经编译好的程序。

为了演示这一策略的有效性,我们需要一个非常耗时的编译过程用于对比。当然,读者肯定不会乐意在第1章就接触一个庞大的工程案例。因此,本书在这里采用了C++“黑魔法”,也就是一段糟糕的模板编程来模拟需要长时间编译的源程序。本书不会讲解该程序细节,相关实现细节感兴趣的读者可自行参考本书配套资源。

本例将会输出斐波那契数列第25项的值。主程序main.cpp如代码清单1.4所示。

代码清单1.4 ch001/漫长等待/main.cpp

#include <iostream>
 
extern int fib25;
 
int main() {
    std::cout << "斐波那契数列第25项为:" << fib25 << std::endl;
    return 0;
}

主程序中声明的外部变量fib25被定义在另一个源程序slow.cpp中。这个源程序就是模拟长耗时编译的源程序,由于有“黑魔法”的存在,我们暂且不去关心它的写法。

使用MSVC构建本例

> cd CMake-Book\src\ch001\漫长等待
> cl main.cpp slow.cpp /EHsc
> .\main.exe
斐波那契数列第25项为:75025

MSVC编译器的/EHsc参数用于启用C++异常处理的展开语义,如果不指定会产生警告。其具体用途请参考其官方文档。

这个编译过程在笔者的移动工作站上运行了超过20秒!

使用GCC构建本例

GCC编译器编译该项目也需要十几秒的时间,过程如下:

$ cd CMake-Book/src/ch001/漫长等待
$ g++ main.cpp slow.cpp
$ ./a.out
斐波那契数列第25项为:75025