為什麼 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多萬行),算是對兩種框架都比較有經驗。
糾正幾個錯誤的認識。
絕對錯誤,單位代碼行數編譯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再多頭文件也沒影響。
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裡面有編譯好的版本。
如果是其它平台,那麼編譯器可以換成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 日這天有什麼特別的表白方式?
※為什麼這兩年沒再聽說有什麼大規模的電腦病毒爆發?
※如何用代碼畫出一隻齒輪?