預(yù)編譯頭文件的問題整了一晚上,終于明白了預(yù)編譯頭文件. DXUT(The DirectX Utility Library)是初學(xué)DirectX的一個好用的框架, 今天照著Sample里的EmptyProject建了一個工程, 引用了DXUT的代碼, 并將設(shè)置-->C/C++-->Precompiled設(shè)置為Use Precompiled Header(/UC), DXUT.h, 發(fā)現(xiàn)怎么也編譯不過去. 搞了半天才發(fā)現(xiàn)DXUT.cpp文件沒有設(shè)置成Create Precompiled Header(/YC).:( 下面隨便介紹一下預(yù)編譯頭文件的原理: 在DXUT.cpp里include一次DXUT.h,生成一次pch,pdb文件,其他地方實際上直接用這個編譯的結(jié)果,從而減少編譯時間,提高編譯效率。一般,我們把常用的不變的庫頭文件放里面,如,atlbase.h,atlcore.h,windows.h等,通常的com里import進來的dll,tlb也放這個里面,這樣,它能做到,只編譯一次,其他地方直接用編譯出的結(jié)果。 如果預(yù)編譯頭文件被正確使用時,它確實大大提高我們編程的效率(你工作中,有多少時間是在等編譯完成?很多吧,這個時候一般都很無聊,無奈,浪費時間)。但是他太容易用錯了. 下面是幾種常見的錯誤用法. 1) 在預(yù)編譯頭文件里include自己的頭文件(當然, 如果你的頭文件不經(jīng)常變化, 也可以) 原因:自己的頭文件一般會經(jīng)常變, 便利后導(dǎo)致預(yù)編譯的東東重新編譯, 降低了編譯速度. 2) 在其他的頭文件里也include 預(yù)編譯頭文件 假設(shè)你的其他頭文件也include了預(yù)編譯頭文件, 如果別人引用你的這個頭文件又沒有設(shè)置成預(yù)編譯頭文件, 那引用你頭文件的這個人就煎熬了. 原因:由于你用到的.h文件里include了預(yù)編譯頭文件,他在他本身的project里,vs能夠判斷的出他是預(yù)編譯頭,也能找的到需要的pch,pdb文件。所以對寫這個.h文件的人沒影響。但是你作為他的客戶,你工作在你的project下,你include了他的h頭文件,而這時vs判斷不出他的頭文件里include的stdafx是預(yù)編譯頭文件,做普通文件編。那可想而知,他的stdafx里如果有import外面大型的庫(如inventor的tlb,非常慢,我們犯了這個錯),那編譯速度簡直是煎熬。最要命的是,以后你做任何簡單的修改都要重編,這和預(yù)編譯解決的問題恰好相反了。 下面給出一個使用預(yù)編譯頭文件的操作步驟, 享受一下預(yù)編譯頭文件給我們帶來的編譯速度的提升: 1) 添加一個stdafx.h文件(名字隨便取, 這里用了VS默認提供的名稱), 在這個.h文件里include要使用的頭文件(一般是外部的庫, 自己寫的不常變的頭文件也可以加進來) 2) 添加一個stdafx.cpp文件, 并include "stdafx.h" 3)項目屬性-->c/c++-->Precompiled設(shè)置為Use Precompiled Header, stdafx.h 4)stdafx.cpp屬性-->c/c++->Precompiled設(shè)置為Create Precompiled Header, stdafx.h done! |
|