Какие-нибудь советы по уменьшению размера кода приложения wxWidgets? - PullRequest
3 голосов
/ 31 декабря 2010

Я написал минимальное приложение wxWidgets:

stdafx.h

#define wxNO_REGEX_LIB
#define wxNO_XML_LIB
#define wxNO_NET_LIB
#define wxNO_EXPAT_LIB
#define wxNO_JPEG_LIB
#define wxNO_PNG_LIB
#define wxNO_TIFF_LIB
#define wxNO_ZLIB_LIB
#define wxNO_ADV_LIB
#define wxNO_HTML_LIB
#define wxNO_GL_LIB
#define wxNO_QA_LIB
#define wxNO_XRC_LIB
#define wxNO_AUI_LIB
#define wxNO_PROPGRID_LIB
#define wxNO_RIBBON_LIB
#define wxNO_RICHTEXT_LIB
#define wxNO_MEDIA_LIB
#define wxNO_STC_LIB

#include <wx/wxprec.h>

Minimal.cpp

#include "stdafx.h"
#include <memory>
#include <wx/wx.h>

class Minimal : public wxApp
{
public:
    virtual bool OnInit();
};

IMPLEMENT_APP(Minimal)
DECLARE_APP(Minimal)

class MinimalFrame : public wxFrame
{
    DECLARE_EVENT_TABLE()
public:
    MinimalFrame(const wxString& title);
    void OnQuit(wxCommandEvent& e);
    void OnAbout(wxCommandEvent& e);
};

BEGIN_EVENT_TABLE(MinimalFrame, wxFrame)
    EVT_MENU(wxID_ABOUT, MinimalFrame::OnAbout)
    EVT_MENU(wxID_EXIT, MinimalFrame::OnQuit)
END_EVENT_TABLE()

MinimalFrame::MinimalFrame(const wxString& title)
    : wxFrame(0, wxID_ANY, title)
{
    std::auto_ptr<wxMenu> fileMenu(new wxMenu);
    fileMenu->Append(wxID_EXIT, L"E&xit\tAlt-X", 
        L"Terminate the Minimal Example.");
    std::auto_ptr<wxMenu> helpMenu(new wxMenu);
    helpMenu->Append(wxID_ABOUT, L"&About\tF1",
        L"Show the about dialog box.");

    std::auto_ptr<wxMenuBar> bar(new wxMenuBar);
    bar->Append(fileMenu.get(), L"&File");
    fileMenu.release();
    bar->Append(helpMenu.get(), L"&Help");
    helpMenu.release();

    SetMenuBar(bar.get());
    bar.release();

    CreateStatusBar(2);
    SetStatusText(L"Welcome to wxWidgets!");
}

void MinimalFrame::OnAbout(wxCommandEvent& e)
{
    wxMessageBox(L"Some text about me!", L"About", wxOK, this);
}

void MinimalFrame::OnQuit(wxCommandEvent& e)
{
    Close();
}

bool Minimal::OnInit()
{
    std::auto_ptr<MinimalFrame> mainFrame(
        new MinimalFrame(L"Minimal wxWidgets Application"));
    mainFrame->Show();
    mainFrame.release();
    return true;
}

Эта минимальная программа весит 2,4 МБ!(Сжатие исполняемого файла уменьшает это до половины МБ или около того, но это все-таки ОГРОМНО!) (Я должен статически связать, потому что это приложение должно быть развернуто как single-binary-xcopy, поэтому и среда выполнения C, и сам wxWidgets настроены для статического связывания)

Любые советы по сокращению этого?(Я использую Microsoft Visual Studio 2010)

Ответы [ 3 ]

2 голосов
/ 31 декабря 2010

Вы можете дополнительно настроить MSVC на компиляцию для небольшого двоичного размера (но это, конечно, может повлиять на производительность), используя флаг /01. Смотрите здесь . Также помните, что wxWidgets должен быть скомпилирован как таковой, чтобы это оказало какое-либо влияние.

И я думаю, что 2,4 МБ для статически связанного приложения довольно прилично ИМХО ...

ОБНОВЛЕНИЕ : вики wxWidgets по исполняемому размеру могут принести некоторое утешение ...

1 голос
/ 07 ноября 2011

Попробуйте добавить переключатели компоновщика следующим образом:

/FILEALIGN:512 /OPT:REF /OPT:ICF /INCREMENTAL:NO

Это уменьшит размер вашего исполняемого файла.

Для простой программы hello world на C ++, если вы хотите скомпилироватьиз командной строки введите следующие команды:

cl /MT /O1 main.cpp /link /FILEALIGN:512 /OPT:REF /OPT:ICF /INCREMENTAL:NO /OUT:test.exe

Если вы попытаетесь проверить исполняемый файл, вы заметите, что размер теперь намного меньше.

1 голос
/ 31 декабря 2010

Вы должны отключить все ненужные функции, установив для большинства wxUSE_XXX в include/wx/msw/setup.h значение 0. Но даже при этом у вас все равно не будет ничего около 90 КБ.

wxWidgets просто никогда не оптимизировали под размер, поэтому, если это ваша основная задача, она, вероятно, вам не подходит (если, конечно, вы не захотите поработать над этим самостоятельно, что было бы очень кстати) Однако на практике это никогда не было проблемой, за исключением, может быть, очень немногих людей.

...