有关减少wxWidgets应用程序代码大小的任何提示?

时间:2010-12-31 05:47:32

标签: c++ wxwidgets

我编写了一个最小的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.4MB! (可执行压缩将此降低到半个MB左右,但仍然很大!)(我必须静态链接,因为此应用程序需要单二进制xcopy部署,因此C运行时和wxWidgets本身都设置为静态链接)

有关削减此功能的任何提示吗? (我正在使用Microsoft Visual Studio 2010)

3 个答案:

答案 0 :(得分:2)

您还可以使用标记/01将MSVC设置为针对较小的二进制大小进行编译(但这可能会影响性能)。见here。还要记住,wxWidgets需要这样编译才能产生任何影响。

我认为静态链接应用程序的2.4 MB相当不错恕我直言......

更新wxWidgets wiki on executable size可能会带来一些安慰......

答案 1 :(得分:1)

您应该通过将wxUSE_XXX中的大部分include/wx/msw/setup.h设置为0来禁用所有不需要的功能。但即便如此,您仍然不会有接近90KB的任何内容。

wxWidgets根本就没有针对大小进行优化,所以如果这是你的主要关注点,那么它可能不适合你(除非你想自己做一些工作,当然,这是非常受欢迎的)。然而,在实践中,它从来不是一个问题,除了可能,对于一个极少数人。

答案 2 :(得分:1)

尝试按如下方式添加链接器开关:

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

这会减少可执行文件的大小。

对于C ++中的简单hello world程序,如果要从命令行编译,请输入以下命令:

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

如果您尝试检查可执行文件,您会发现现在的尺寸要小得多。