2013-04-06 5 views
1

wxDev-C++ IDE를 사용하여 매우 간단한 GUI (요소가없는 프레임 만)로 C++ 응용 프로그램을 간단하게 만듭니다. 윈도우 7).
문제는 출력 .exe 파일의 크기가 너무 큽니다 (GCC 컴파일을 사용할 때 &을 사용하여 컴파일 할 때 약 2MB입니다. GCC 컴파일을 사용할 때이 크기가 가장 좋습니다!).
디버그 정보를 제외하거나 크기를 최적화하는 등 여러 가지 가능성을 확인했지만 실행 가능 크기를 줄이는 데 도움이되지는 않습니다.
코드 크기가 약 1MB 인 거의 모든 위젯을 포함하고있는 demo application을 본 적이 있기 때문에 링크 문제가 있다고 생각합니다.
아이디어가 있으십니까?wxDev-C++에서 GCC 또는 MSVC 컴파일러를 사용할 때 너무 큰 실행 파일 크기

+0

정적 또는 동적 연결? –

+0

물론 정적 –

답변

0

전체 내용을 하나의 exe 파일로 압축하면 무엇을 기대 했습니까? (정적)

많은 요인에 따라 컴파일 된 .exe 파일의 크기입니다. 그러나 정적으로 컴파일하면 가장 큰 것을 만듭니다.

예를 들어 wxWidgets 응용 프로그램입니다. 두 번 컴파일. 하나는 VC2010이고 다른 하나는 minGW입니다. VS2010 WINXP 127.488 KB와 함께 동적 컴파일

enter image description here

enter image description here

는 MinGW gcc가 WINXP 1.018.639 KB와 함께 동적 컴파일

enter image description here

당신이 쓴 :
,549,321 0

우리는 모든 파일을 볼 수있는 한. 또는 다른 설정, 여기에 도움이 어렵습니다.

위의 결과에 따르면 128,000KB의 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

:

이 -Os

-ffunction 섹션 -fdata 섹션은 자체 섹션에 각 함수 또는 데이터 항목을 배치합니다.

2.다음 옵션을 사용하여 라이브러리에 실행 파일을 링크 :

-Wl은 - GC-섹션

기호 및 사용되지 않는 기능을 -s 및 데이터 섹션이 제거됩니다.

이러한 옵션을 사용하면 생성 된 실행 파일 크기는 약 3.3MB가됩니다. 물론 이것은 미리 작성된 바이너리 대신에 직접 라이브러리를 컴파일해야한다는 것을 의미합니다. 나는 라이브러리를 컴파일하려면 다음과 박쥐 파일을 사용했다 :

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 

또한 당신이 코드 :: 블록 또는 대신 wxDev의 Qt는 창조주를 사용하는 것이 좋습니다. 저는 개인적으로 Qt Creator를 사용합니다. 훌륭한 편집기와 QMake를 사용하면 더 쉽게 작업 할 수 있습니다.

관련 문제