為什麼 Qt Creator 的編譯如此之慢?

我是一隻Qt小白,上學期期末數據結構課程設計時接觸Qt,程序並不大,數據結構的課設嘛,主要在於演算法,程序里無非就是簡單的窗口跳轉啊,輸出一些文本啊,但是編譯很慢,我的工程要10秒左右。其他同學有用MFC的,編譯時就是點一下然後UI秒開,對此我感到很好奇!(雖然MFC很難用我覺滴)

這學期可視化編程用的是C#,IDE用VS,編譯時也是一點秒開。C#也是剛剛接觸不怎麼了解,個人初步感覺很多東西的做法比Qt簡單些,尤其是對於愛點UI的小白來說,上手快是建立好感的重要前提。但是VS提供了這麼方便的UI操作,不是應該用到很大的動態鏈接庫嗎?為什麼編譯速度反而更快?

如果排除我課設里開了非常多文件,以及代碼量不同的問題外,Qt的編譯慢是否是Qt的通病?以前還在人人上看到用Qt編譯WebKit用了接近15min。是什麼原因使得Qt的編譯這麼慢?希望各位菊苣能高屋建瓴地解釋一下。我使用Qt Creator(小白就是視覺動物嘛。。),這是否也是原因之一?


我是來反對樓上某些答案的。
我曾經用MFC寫了金山詞霸(大約20多萬行),又用Qt寫了YY語音(大約100多萬行),算是對兩種框架都比較有經驗。
糾正幾個錯誤的認識。

1. 「用Qt寫的程序編譯比MFC慢」的說法是錯誤的
絕對錯誤,單位代碼行數編譯Qt遠比MFC快得多,因為Qt庫的頭文件設計非常好,盡量都使用了前置聲明,避免了頭文件嵌套,幾乎所有類都使用了公有類和私有類的設計,把沒必要公開的聲明放到私有頭文件里,避免了編譯時引入過多代碼。而MFC沒有這樣的設計。
至於大家感覺MFC快主要原因是MFC工程默認打開了編譯預處理頭文件(PCH),但是這是VC編譯器的特性,所有C++程序都可以用,不是MFC特有,Qt也可以使用 PCH
方法很簡單,在你的 .pro 文件中加入一行

PRECOMPILED_HEADER = stable.h

指定 Stable.h這個頭文件作為編譯預處理文件,MFC里這個文件一般叫stdafx.h
然後在 stable.h里 包含你所用到的所有 Qt 頭文件,如果你用了很多qt的類可以直接包含所有
比如 :

#include &
#include &

這兩個文件里又包含了幾乎所有Qt常用類
不用擔心,即使包含了所有頭文件也沒關係,有了PCH再多頭文件也沒影響。

如果你還想編譯再快點,可以在 .pro里加入下面一行

QMAKE_CXXFLAGS += /MP

指定/mp編譯選項,編譯器將使用並行編譯,同時起多個編譯進程並行編譯不同的cpp

而且QT這種引入PCH的方法比MFC的好,由於MFC的PCH選項是每個工程逐個指定的,很容易被某些人搞壞,我曾經無數次修復PCH問題,但是Qt的選項是寫在.pro里的,寫一次就永遠不會錯。
MFC一旦弄壞了PCH,編譯也慢得令人髮指。

給個參考時間吧,YY最新版本大約 100多萬行C++代碼,rebuild debug和releae總共需要20多分鐘,機器是i5 四核SSD硬碟。其實對於大項目硬碟才是瓶頸,如果換機械硬碟要慢差不多70%,有個同事用10G內存做了個內存檔編譯,還能快30%。

如果你比這個慢,請檢查自己的代碼問題。

2. 「QT本身編譯慢」的說法是錯的
Qt本身其實編譯並不慢,慢的是webkit庫和例子程序,你如果不改任何選項默認是會編譯所有的,webkit本身就是個恐龍級項目,用了太多泛型技術,編譯非常慢。另外Qt里附帶了數百個例子工程,都編譯一邊也很慢。如果僅編譯QT核心庫是很快的,比如QtCore只需要1分鐘,QtGui大約5分鐘。

送個福利(僅限windows vc++ 2008):

configure.exe -qt-libjpeg -qt-zlib -qt-libpng -qt-libjpeg -qt-gif -no-libtiff -no-libmng -nomake examples -nomake demos -no-webkit -nomake doc -no-plugin-manifests -no-exceptions -no-rtti -no-qt3support -no-openssl -no-opengl -no-multimedia -no-3dnow -no-native-gestures -no-style-motif -no-style-cde -no-style-cleanlooks -no-style-plastique -no-sql-sqlite -no-dbus -platform win32-msvc2008

這是我自己用的Qt編譯前的配置命令行,把我自己用不到的都去掉了,這樣配置編譯就快很多了。
我把 webkit examples demos 等大傢伙都去掉了。如果你真的需要這些,可以安裝Qt sdk裡面有編譯好的版本。

補充:Qt creator只是IDE,不是編譯器,編譯慢真的不關他的事,要看你具體用的編譯器是什麼。一般來說在Windows下就是minGW,也就是一個移植版本的GCC,的確是不如VC++里的CL快的。
如果是其它平台,那麼編譯器可以換成LLVM的clang,那就快很多了。
在Windows下來是用VC++吧,推薦VC2008,Qt和VC的IDE結合非常好,我現在的項目都是用VC2008+QT的,開發效率很高,記得裝Visual Assist哦。

qmake -tp vc

可以用 .pro生產 .vcproj的VC工程文件,可以用VC++打開編譯。


C++ 的編譯很慢,與其他語言完全不在一個數量級。任何 C++ 項目都比其他語言的編譯慢,一方面是 C++ 語言本身複雜,另外一方面是 C++ 頭文件太大,很多庫是直接在頭文件裡面實現的,所以每次需要編譯的代碼量很大。這個跟 C# 沒有可比性。

MFC 使用預編譯頭文件來緩解這個問題,在 VC 裡面集成了預編譯好的 MFC 頭文件,因而編譯速度過得去。

Qt Creator 使用 mingw-gcc 編譯,沒有預編譯頭文件的機制,對每個源代碼都需要編譯 Qt 的頭文件,所以完全編譯會是慢的,當然,你可以自行選擇一些編譯加速機制,例如ccache等等。


我簡單說一句。

譬如說C#有4個文件,一個10000行,那就是40000行。

譬如說C++也有4個文件,一個10000行,a.h include b.h,a.cpp include a.h,b.cpp include b.h,那b.h還是10000行,a.h變成20000行,a.cpp就變成了30000行,b.cpp就變成了20000行,實際需要編譯的兩個cpp共50000行。這還是文件少的情況。文件一多,而且基本上是一棵樹這樣include下去的話,最終需要編譯的代碼行數會以平方(經驗值)的大小暴漲。


而且,C++很多編譯期要計算的東西導致了,就算你不include,編譯的也比C#慢許多。再加上include的問題,所以這也是為什麼VC++有precompiled header,而且你也需要一塊SSD的原因之一。

==================================

其實題主比較的是Qt和C#的GUI的編譯速度為什麼差距那麼大,MFC只是一筆帶過,那根本不是重點。


用 Linux 還是很快的。

開 ccache 會更快。

這個本來也不是為 Windows 設計的東西。相同硬體配置,qtcreator 在 linux 下編譯速度遠遠好於在 Windows 下,這是目前我們測試出來的事實。即便用 MSVC 編譯,也趕不上 Linux 下的速度。


按我做的一些用Qt開發的軟體得到的經驗表示,第一次全部編譯是慢一點,但是如果修改幾個文件再編譯,也幾乎是秒開啊。


如果可以盡量不要#include &,處理這個頭文件需要的時間相當長……

而且Qt程序的代碼也不像MFC/WinForm那樣直接交給編譯器,它必須用Qt的一套工具作預處理之後才能編譯。

我也是小白,聽聽其他菊苣怎麼說的。


QtCreator在windows下用Mingw編譯的時候,在正式開始編譯前,會卡一段時間,大概10s左右的樣子,所以對小工程就可能造成編譯速度慢的假象,如果是這個情況,你需要在make和clean的參數選項前加 個 「-r」 ,這樣就會直接開始編譯工作,速度馬上就會快很多了。
如果還需要多線程編譯的,那再加個比如" -j4" 就是開4線程進行編譯。


每次編譯可以先去個廁所, 然後上個知乎


樓主也不說用什麼kit,如果是靜態鏈接的話光幾十兆的編譯結果就說明了一切
我平時在linux下寫Qt,最近用VS寫C++,感覺編譯速度慢了半條街→_→


這與Qt平台機制有關:

Qt程序編譯的時候,會將與Qt平台相關的東西(Q_OBJECT)轉化為標準的c++程序,然後才使用編譯器編譯,生成makefile,.o,可執行文件等。

一般常用辦法,解決緩慢,尤其針對大程序,在「項目」那一欄添加make參數,也就是添加編譯線程,最多可以添加9個線程,但我自己一般開5個,使用-j5的參數。

這樣的原因,是因為編譯Qt程序的步驟為:1.qmake -project,2.qmake,3, make。使用的make編譯,於是我們可以添加make編譯參數,加快編譯。


東哥寫的很詳細了。
前置聲明,PIMPL,預編譯頭
實在忍受不了,還有分散式編譯工具。
再說,也不是總是rebuild,改點東西編譯一下,不會太誇張吧!


同步IO上的開銷很大


從眾大神那裡學到了PCH、.cpp包含秘訣。。。受益匪淺


Qt在編譯前用moc進行了預編譯,當然慢了


用的mac,brew install qt5,卡在這裡半小時了。。。CPU 90%以上。。


推薦閱讀:

兒童學編程,教什麼語言好?
如果不讀博士,做深度學習能找到工作嗎?還想學一下編程,C++和python,該怎麼學習呢?
程序員在 5 月 20 日這天有什麼特別的表白方式?
為什麼這兩年沒再聽說有什麼大規模的電腦病毒爆發?
如何用代碼畫出一隻齒輪?

TAG:編程 | Qt(C++ 開發框架) | C++ | C# |