C++ Unity Build 统一构建,加速编译速度

1.大规模工程遇到的困惑

    
    项目开发过程中,当代码量过大时,都会出现编译工程很耗时的情况(例如笔者项目开发中,整套工程编译下来,大概需要30分钟),怎样提高编译速度呢。

2.快速编译的利器

    答案是采用Unity Build技术。(同时适用于Windows和Linux)。采用该方法后,笔者的项目编译时间有原来的30分钟,缩短为3分钟。项目越大,加速比越高。 简单来说,就是把若干个cpp文件,都inlcude到一个cpp里面编译即可。

    举例:

    假如一个工程里有3个cpp文件,分别是UnityBuld1.cpp(主工程文件,内有main()函数),另外两个是实现其他功能的文件,FirOper.cpp和SecOper.cpp。只要建立第4个cpp文件Pack.cpp,把FirOper.cpp和SecOper.cpp包含到Pack.cpp,然后只编译UnityBuld1.cpp和Pack.cpp即可。
    如何做到只编译UnityBuld1.cpp和Pack.cpp?

    对于Visual Studio来说,只要在项目属性里把UnityBuld1.cpp和Pack.cpp设置成C/C++标头即可。

    对于Linux来说,在makefile里面,待编译的源文件只设置为UnityBuld1.cpp和Pack.cpp即可。

    Windows工程代码链接如下:

     点击打开链接

3.UnityBuild潜在问题

    既然Unity Build 有这么优良的表现,为什么一直没有大量推广呢?因为它还有自己的复杂性,大型项目应用中,不似上面的工程这么简单。现在就来谈它的复杂性。

    真实项目应用中。一个系统会有若干个工程。 

    例如假定UnityBuldBase为基础工程,提供与业务无关的公有的底层操作功能;提供了两个功能块:FirOper.cpp和SecOper.cpp,而其中SecOper.cpp调用了第三方库TriLib。然后我们对UnityBuldBase统一构建编译,不会出问题,接着把构建好的lib提供给其他业务调用。

    UnityBuldApp为另外一个独立业务工程,调用UnityBuldBase提供的库函数。假设UnityBuldApp需要调用FirOper.cpp提供的功能,而不管它是否调用SecOper.cpp提供的功能,都无法链接通过,报错信息为无法找到TriLib提供的功能。

    这是因为UnityBuldBase把FirOper.cpp和SecOper.cpp构建成了一个独立的.obj文件,当UnityBuldApp做链接检查时,只要调用到FirOper.cpp,都会对SecOper.cpp的调用依赖性做检查,而作为库文件提供者的UnityBuldBase是只编译不链接的,所以必然会出错。该怎么办?

4.工程实践解决方法

    解决方法有两种。
    第一种方法是,不管UnityBuldApp是否会用到UnityBuldBase里面的SecOper.cpp,都要把第三方库TriLib显性加进依赖中,这样就能链接成功;
    第二种方法是,把依赖第三方库的SecOper.cpp单独构建,而把不依赖第三方库的源码功能块加到一个统一的cpp里面构建,这样就不会链接出错了。

    不过话说回来,能有几个源码功能块不依赖第三方库呢。这可能也就是为什么这个方法没有大量普及的原因。不过,相比随着代码膨胀带来的低效编译速度,两者权衡,UnityBuild始终是个不错的方案。而在项目实践中,上面两种解决办法相结合可能会更合适。



继续

你可能感兴趣的:(工程管理)