簡體   English   中英

在GNU / Linux環境/工具鏈中,預編譯頭的優缺點是什么?

[英]What are the pros & cons of pre-compiled headers specifically in a GNU/Linux environment/tool-chain?

預編譯的標題似乎可以在大型項目中節省大量時間,但似乎也是一個有點陷阱的痛苦。

使用預編譯頭文件的優點和缺點是什么,特別是因為它適用於在Gnu / gcc / Linux環境中使用它們?

預編譯頭的唯一潛在好處是,如果構建太慢,預編譯頭可能會加快它們的速度。 潛在的缺點:

  • 更多Makefile依賴項以獲得正確; 如果他們錯了,你就快速建立錯誤的東西。 不好。

  • 原則上,並非每個頭都可以預編譯。 (考慮在#include之前放一些#define。)那么gcc實際上哪些情況正確? 你想要相信這個前沿功能多少錢?

如果您的構建足夠快,則沒有理由使用預編譯頭 如果您的構建太慢,我會考慮

  • 購買速度更快的硬件,與工資相比便宜

  • 使用像AT&T nmake這樣的工具或類似ccache (Dirk正確),這兩種工具都使用值得信賴的技術來避免重新編譯。

我無法與GNU / gcc / linux交談,但我已經在vs2005中處理了預編譯的頭文件:

優點:

  • 當您擁有許多模塊包含的大標頭時,可以節省編譯時間。
  • 適用於不經常更改的標題(例如來自第三方)。

缺點:

  • 如果將它們用於變化很大的標題,則會增加編譯時間。
  • 可以很好地設置和維護。
  • 如果您不強制編譯預編譯的頭,則有時會明顯忽略對標頭的更改。

ccache緩存前端到gcc,g ++,gfortran,...對我來說很有用。 正如其網站所說

ccache是​​一個編譯器緩存。 它充當C / C ++編譯器的緩存預處理器,使用-E編譯器開關和哈希來檢測何時可以從緩存中滿足編譯。 這通常會導致常見編譯速度提高5到10倍。

在Debian / Ubuntu上,只需執行' apt-get install ccache '並在/usr/local/bin創建軟鏈接,其名稱為gccg++gfortranc++ ,...指向/usr/bin/ccache

[ 編輯 ]為了使這一點更明確以回應一些早期的評論:這通過緩存更大的編譯步驟塊來提供基本上預編譯的頭和源 因此它使用類似於預編譯頭的想法,並進一步進行。 加速可能是戲劇性的 - 如網站所說,是5到10倍。

對於普通的C,我會避免使用預編譯的頭文件。 正如您所說,它們可能會導致問題,與常規編譯相比,預處理時間非常短。

對於C ++,預編譯頭可能會節省大量時間,因為C ++頭通常包含編譯成本高昂的大型模板代碼。 我沒有他們的實際經驗,所以我建議你測量你在項目中獲得的編譯節省多少。 為此,使用預編譯頭文件編譯整個項目一次,然后刪除單個目標文件,並測量重新編譯該文件所需的時間。

GNU gcc文檔討論了預編譯頭文件可能存在的缺陷。

我在Qt項目中使用PCH,它使用cmake作為構建系統,它節省了大量時間。 我抓了一些PCH cmake腳本,需要一些調整,因為它們已經很老了,但它通常比我預期的更容易設置。 我必須補充一點,我不是一個cmake專家。

我現在包括Qt的大部分內容(QtCore,QtGui,QtOpenGL)和一些穩定的標題。

優點:

  • 對於Qt類,不需要前向聲明,當然也不包括。
  • 快速。
  • 易於設置。

缺點:

  • 您不能在標題中包含PCH包含。 這不是什么大問題,如果您使用Qt並讓構建系統單獨轉換moc文件,這恰好是我的配置。 在這種情況下,您需要#include標頭中的qt標頭,因為mocs是從標頭創建的。 解決方案是在標題中的#include周圍添加額外的包含防護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM