使用预编译头提高编译速度
什么是預(yù)編譯頭
在介紹預(yù)編譯頭之前,有必要了解一下C/C++的編譯方式。C/C++的編譯單元是源文件(帶有.c、.cc、.cpp等擴(kuò)展名的文件),在編譯一個源文件之前,預(yù)處理器會把這個源文件中所有通過#include指令包含進(jìn)來的頭文件遞歸地展開,也就是把所有直接或間接包含的頭文件原封不動地插入進(jìn)來。當(dāng)這個過程結(jié)束之后,才開始編譯。
這種編譯方式的缺點(diǎn)是會使頭文件被重復(fù)編譯。假如有一百個源文件都包含了Windows.h,那么這個頭文件會在一百個源文件中展開,它里面的代碼會被重復(fù)編譯了一百次,盡管每次編譯的結(jié)果都相同。對于具有成千上萬個源文件的大型項(xiàng)目來說,重復(fù)編譯是難以接受的,會浪費(fèi)大量的編譯時間。
為了解決這個問題,預(yù)編譯頭應(yīng)運(yùn)而生。顧名思義,預(yù)編譯頭就是預(yù)先把頭文件編譯好,在編譯源文件的時候直接取用這些編譯結(jié)果,避免對頭文件重復(fù)編譯。這項(xiàng)技術(shù)能大幅提高C++的編譯速度。
Visual C++生成的擴(kuò)展名為.pch的文件即是預(yù)編譯頭生成的結(jié)果。
如何使用預(yù)編譯頭
Visual C++對預(yù)編譯頭的設(shè)置并不直觀,容易造成誤解。在這里詳細(xì)介紹一下如何啟用預(yù)編譯頭。以下操作是在Visual Studio 2013上進(jìn)行的,不過Visual Studio各版本之間的差異不大,更早或更新的版本也適用。
首先要做的,是在項(xiàng)目中添加一個頭文件以及源文件,這兩個文件是給預(yù)編譯頭這個機(jī)制使用的。它們的名稱并沒有限制,這里把它們命名為precompiled.h和precompiled.cpp(Visual C++使用的默認(rèn)名字是StdAfx.h和StdAfx.cpp)。
precompiled.h將被指定成預(yù)編譯頭文件,所有在這個頭文件中的代碼都會被預(yù)編譯。可以把任意代碼添加到這個文件,一般的做法是把常用的頭文件包含進(jìn)來,例如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
precompiled.cpp則為precompiled.h提供了編譯的載體,因?yàn)镃/C++只能對源文件編譯,而不能對頭文件編譯。precompiled.cpp只需要包含precompiled.h即可(由于示例項(xiàng)目的需要,包含語句中包含了相對路徑):
| 1 |
接下來,指定通過precompiled.cpp來生成預(yù)編譯結(jié)果。在“解決方案資源管理器中”,右擊precompiled.cpp文件,在彈出的菜單中點(diǎn)擊“屬性”,打開該文件的屬性頁窗口。
在屬性頁窗口中,打開“預(yù)編譯頭”配置頁,設(shè)置“預(yù)編譯頭”選項(xiàng)的值為“創(chuàng)建(/Yc)”,設(shè)置“預(yù)編譯頭文件”選項(xiàng)的值為“win/precompiled.h”。如下圖所示:
點(diǎn)擊確定完成設(shè)置。如此一來,在編譯precompiled.cpp的時候就會生成預(yù)編譯結(jié)果,也就是.pch文件。
設(shè)置了生成預(yù)編譯結(jié)果之后,還需要設(shè)置使用預(yù)編譯結(jié)果。在“解決方案資源管理器中”,右擊項(xiàng)目節(jié)點(diǎn),在彈出的菜單中點(diǎn)擊“屬性”,打開項(xiàng)目的屬性頁窗口。
同樣地,在屬性頁窗口中打開“預(yù)編譯頭”配置頁,設(shè)置“預(yù)編譯頭”選項(xiàng)的值為“使用(/Yu)”,設(shè)置“預(yù)編譯頭文件”選項(xiàng)的值為“win/precompiled.h”。要注意“預(yù)編譯頭”選項(xiàng)的值跟之前的不同。如下圖所示:
最后,需要在所有的源文件中包含預(yù)編譯頭文件,并且該文件必須是第一個包含的。這是使用預(yù)編譯頭的硬性規(guī)定,假如不遵守這個規(guī)定,編譯會失敗。重復(fù)地在所有源文件中添加預(yù)編譯頭文件很繁瑣,所幸的是Visual C++提供了強(qiáng)制在所有源文件中包含指定頭文件的選項(xiàng)。同樣在項(xiàng)目的屬性頁窗口中,打開“C/C++”分類下的“高級”配置頁,在“強(qiáng)制包含文件”的選項(xiàng)中,添加“win/precompiled.h”即可,如下圖所示:
至此,預(yù)編譯頭的設(shè)置就完成了。注意,在預(yù)編譯頭文件之后再重復(fù)包含該文件內(nèi)已包含的頭文件并不會有問題,所以不必特意去掉那些重復(fù)的包含語句。
?
轉(zhuǎn)自:http://zplutor.github.io/2015/09/28/use-precompiled-header-to-speed-up-compilation/
轉(zhuǎn)載于:https://www.cnblogs.com/cqu-qxl/p/6731200.html
總結(jié)
以上是生活随笔為你收集整理的使用预编译头提高编译速度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue项目在移动端(手机)调试
- 下一篇: NSArray打印汉字的方法