2013-04-06 426 views
1

我創建一個簡單的(世界,你好!)C++使用wxDev-C++ IDE用一個非常簡單的GUI(僅適用於無元素的幀)應用程序(在Windows 7的)。
問題是輸出.exe文件的該尺寸過大(2MB左右,當我編譯使用MSVC10編譯&更多的8MB,當我使用GCC編譯&這些尺寸是最好的情況下!)。
我已經檢查了很多可能性(例如排除調試信息或優化大小),但其中沒有一個對於減小可執行文件大小沒有幫助。
我強烈猜測存在鏈接問題,因爲我看過一個demo application,它包含幾乎所有的小部件,只有大約1MB的代碼大小。
有什麼想法?過大的可執行文件的大小

+0

靜態或動態鏈接? – 2013-04-06 17:33:05

+0

當然是靜態的 – 2013-04-06 17:35:28

回答

0

當你將整個內容打包到一個exe文件中時,你期望什麼? (靜態)

基於許多因素的編譯.exe文件的大小。但是如果你將它編譯爲靜態的,你創建的是最大的。

這裏是例如一個wxWidgets應用程序。編譯兩次。一個用VC2010,另一個用minGW。

enter image description here

動態編譯與VS2010的WinXP 127.488 KB

enter image description here

動態編譯使用MinGW的gcc的WinXP 1.018.639 KB

enter image description here

你寫道:
about 2MB when I compile using MSVC10 compiler & more that 8MB when I use GCC compile & these sizes are best cases!.

只要我們可以看到任何make文件。或其他設置,這裏很難提供幫助。

向上述結果,可以看出,有可能產生具有僅128.000 KB一個WX應用。

dtx02.cpp

#include "dtx02.h" 

/////////////////////////////////////////////////////////////////////////// 

dxDialog::dxDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxDialog(parent, id, title, pos, size, style) 
{ 
    this->SetSizeHints(wxDefaultSize, wxDefaultSize); 

    wxBoxSizer* bSizer2; 
    bSizer2 = new wxBoxSizer(wxVERTICAL); 

    m_button1 = new wxButton(this, ID_SHOWMESSAGE, wxT("&Show a message"), wxDefaultPosition, wxDefaultSize, 0); 
    bSizer2->Add(m_button1, 0, wxALL, 5); 

    m_button2 = new wxButton(this, wxID_OK, wxT("&Close"), wxDefaultPosition, wxDefaultSize, 0); 
    bSizer2->Add(m_button2, 0, wxALL, 5); 

    m_notebook1 = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); 
    m_panel1 = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
    m_panel1->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); 

    m_notebook1->AddPage(m_panel1, wxT("a page"), true); 
    m_panel2 = new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
    m_notebook1->AddPage(m_panel2, wxT("a page"), false); 

    bSizer2->Add(m_notebook1, 1, wxEXPAND | wxALL, 5); 

    this->SetSizer(bSizer2); 
    this->Layout(); 

    this->Centre(wxBOTH); 

    // Connect Events 
    this->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(dxDialog::OnClosex)); 
    m_button1->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(dxDialog::OnShowMessage), NULL, this); 
    m_button2->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(dxDialog::OnClose), NULL, this); 
} 

dxDialog::~dxDialog() 
{ 
    // Disconnect Events 
    this->Disconnect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(dxDialog::OnClosex)); 
    m_button1->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(dxDialog::OnShowMessage), NULL, this); 
    m_button2->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(dxDialog::OnClose), NULL, this); 

} 

dtx02App.cpp

#include "dtx02App.h" 
#include "dtx02dxDialog.h" 

IMPLEMENT_APP(dtx02App) 

dtx02App::dtx02App() 
{ 
} 

dtx02App::~dtx02App() 
{ 
} 

bool dtx02App::OnInit() 
{ 
    dtx02dxDialog* dialog = new dtx02dxDialog((wxWindow*)NULL); 
    dialog ->Show(); 
    SetTopWindow(dialog); 
    return true; 
} 

dtx02dxDialog.cpp

#include "dtx02dxDialog.h" 

dtx02dxDialog::dtx02dxDialog(wxWindow* parent) 
: 
dxDialog(parent) 
{ 

} 

void dtx02dxDialog::OnClosex(wxCloseEvent& event) 
{ 
    wxTheApp->Exit(); 
} 

void dtx02dxDialog::OnShowMessage(wxCommandEvent& event) 
{ 
     wxMessageBox(wxT("wxFormBuilder Tut")); 
} 

void dtx02dxDialog::OnClose(wxCommandEvent& event) 
{ 
    wxTheApp->Exit(); 
} 
1

這裏有您需要按照減少靜態鏈接wxWidgets的大小的步驟使用mingw的應用程序:

1.Compile使用下列選項庫:

-ffunction截面-fdata截面-Os

這將會把每個功能或數據項到自己的部分。

2。鏈接可執行文件到圖書館使用下列選項:

輪候冊, - GC-部分-s

符號和未使用的功能和數據段將被刪除。

使用這些選項,生成的可執行文件大小將約爲3.3 MB。當然,這意味着你必須自己編譯庫,而不是使用預編譯的二進制文件。我用下面的bat文件編譯庫:

cd C:\wxWidgets\build\msw 
mingw32-make SHELL=CMD.exe -j4 -f makefile.gcc BUILD=release UNICODE=1 SHARED=0 clean 
mingw32-make SHELL=CMD.exe -j4 -f makefile.gcc CPPFLAGS="-MD -MP -DHAVE_W32API_H -D__WXMSW__ -DNOPCH -DwxDEBUG_LEVEL=0 -DNDEBUG" CFLAGS="-mthreads -pipe -fmessage-length=0 -ffunction-sections -fdata-sections -fno-builtin -Os" CXXFLAGS="-mthreads -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -ffunction-sections -fdata-sections -fno-builtin -Os" LDFLAGS="-Wl,--subsystem,windows -Wl,--gc-sections -s -mthreads -mwindows" BUILD=release UNICODE=1 SHARED=0 

此外,我建議你使用的代碼::塊或Qt Creator的替代wxDev。我個人使用Qt Creator。它有一個偉大的編輯器,QMake使事情變得更容易。

相關問題