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