2015-12-14 64 views
2

我正在使用Qt 4.8.5在Fedora上創建一個程序(我們稱之爲ProgramWP),並基於帶有QWizardPages的QWizard結構。該計劃有50多個班級,其中30個是QWizardPages。Qt:我怎樣才能讓我的exe的重量減少

的事情是,可執行程序「權重」(不知道英文單詞/表達式)爲8MB(發行版),我想知道:

  • 爲什麼它體重這麼多?原因是什麼?
  • 我該如何減少它?

我需要減少它,因爲在企業的產品中,有一些應用程序運行,其中一些是我的。用晚餐了exe文件的:

  • ProgramMAIN(1.5MiB):企業的主程序。
  • ProgramMAIN2(600KiB):企業的另一個重要方案。
  • ProgramWP(8MiB):我的主程序(用Qt製作)。
  • ProgramMINI(2.5Mib):我的主程序(使用Qt製作)的迷你版本。
  • 節目3(1.3MiB):我的其他程序使用Qt

做正如你可以看到我的主程序的權重那麼那麼那麼多比主之一,而最主要的是SOOOO更大(ProgramWP是隻是一個小程序來配置一些簡單的事情)。

我在ProgramWP和ProgramMINI中靜態鏈接了一些庫,但programMAIn和ProgramMAIN2也是如此...因此,知道ProgramMain2與鏈接庫是600Kibs,我的ProgramWP應該不會超過這個重量。

這是我做的.pro文件鏈接:

unix:!macx: LIBS += -L$PWD/../../ConfigLib/Release/ -lLib1 
INCLUDEPATH += $PWD/../../Lib1 
DEPENDPATH += $PWD/../../Libs/Release 
unix:!macx: PRE_TARGETDEPS += $PWD/../../Libs/Release/Lib1.a 

我已經搜查和詢問,發現我可以在QMAKE_CXX_FLAGS+= -s行添加到.pro文件刪除unnecesary,代號後這樣做,並運行qmake,它仍然是重量相同(這就像是如果它被忽略)。我已經看到,如果GCC使用-s PARAM和重建,我得到:

g++ -c -pipe -std=c++11 -s -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_SCRIPT_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib/qt4/mkspecs/linux-g++ -I../MyProject-I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include/QtXml -I/usr/include/QtScript -I/usr/include -I../../Utils -I../../Lib1-I../../Lib2-I../../Lib3-I../../Lib4-I. -I. -I../MyProject-I. -o wp2.o ../MyProject/wpmine.cpp 

所以你可以看到,似乎是GCC使用的是PARAM所以......爲什麼會這樣重,哪有什麼想法我修復它?

非常感謝。

注意:他們的程序基本上是用eclipse和C++編寫的,而我的是用Qt編寫的。爲了運行它,他們已經在企業產品中安裝了一些Qt庫,所以另一個問題是......他們能否在沒有安裝該庫的情況下運行我的程序?只是放在那裏的exe和調用它?

+1

可執行文件的大小與Qt一樣大,因爲Qt是庫中的一塊臃腫塊。想讓它變小嗎?保持Qt清除。 – IInspectable

+0

哈哈哈很好:)但是我的老闆想要Qt製作的程序,現在他們希望它的重量低於他們的程序......我會在主帖中添加一條關於它的註釋,因爲他們的程序是在eclipse中製作的, C++ – Megasa3

+0

EXE的大小是非常不相關的。如果你想部署一個Qt應用程序,你必須在應用程序旁邊發佈支持庫(Windows上的DLL)。對於什麼都不做的標準應用程序,它們的重量大約爲30MiB。 – IInspectable

回答

4

這裏有一些提示,以減少可執行文件的大小:

  • 你可能想在你的可執行文件使用strip(萬一出事了與編譯器的-s標誌)

  • -Os標誌進行編譯可能稍微減少可執行文件的大小

  • 減小可執行文件數據段的大小。需要注意的是每一個常數(包括字符串常量,靜態數組初始化等)的內部存儲可執行文件,並會增加它的大小:

    const char* str = "A very very long string"; // will bloat your executable 
    
    BigDataType myData[] = { ... }; // will bloat your executable 
    
  • 移動嵌入式資源到外部文件(甚至到網絡)。嵌入圖標,圖像,字符串等)顯着增加二進制大小。請參閱QtResource

  • 減少模板代碼的使用。大量使用模板(以及它們的實例化)是衆所周知的代碼膨脹的原因。這是代碼大小和代碼美感之間的折衷。

  • 你可能想嘗試CopperSpice,Qt的一個分支,如果它做得更好。

+0

如何刪除我在海灣合作委員會的第二個-O2?將資源移動到外部文件,就像使用xml來存儲數據一樣? – Megasa3

+0

我不知道第二個'-O2'來自哪裏。檢查你的'.pro'文件。當然,你可以用XML或任何你喜歡的格式存儲數據,這取決於它是什麼樣的數據和你的偏好。這個想法是將數據從可執行文件移出到其他地方,從而減少了可執行文件的大小。 – Drop

+0

OK OK,我沒有在親文件超過'QT + =核心GUI QT + =網絡 QT + =腳本 QT + =日期 QT + =時間 QT + = XML QMAKE_CXXFLAGS + = -std = C++ 11 QMAKE_CXXFLAGS + = -s'所以不知道第二個O2,這就是爲什麼我問。關於xml我已經使用它們來處理一些組合框和大量信息。 – Megasa3