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

C++ 关于减少wxWidgets应用程序代码大小的任何提示?,c++,wxwidgets,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_L

我已经编写了一个最小的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>
#定义wxNO_REGEX_LIB
#定义wxNO_XML_库
#定义wxNO_NET_LIB
#定义wxNO_EXPAT_LIB
#定义wxNO_JPEG_库
#定义wxNO_PNG_库
#定义wxNO_TIFF_LIB
#定义wxNO_ZLIB_库
#定义wxNO_ADV_LIB
#定义wxNO_HTML_库
#定义wxNO\u GL\u库
#定义wxNO_QA_库
#定义wxNO_XRC_库
#定义wxNO_AUI_库
#定义wxNO_PROPGRID_LIB
#定义wxNO_功能区_库
#定义wxNO_RICHTEXT_库
#定义wxNO_媒体_库
#定义wxNO_STC_LIB
#包括
最小值.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;
}
#包括“stdafx.h”
#包括
#包括
最小类:公共wxApp
{
公众:
虚拟bool-OnInit();
};
实施应用程序(最小)
声明应用程序(最小值)
类最小帧:公共wxFrame
{
声明事件表()
公众:
最小帧(const wxString&title);
退出时无效(wxCommandEvent&e);
无效OnAbout(wxCommandEvent&e);
};
开始事件表(最小帧、wxFrame)
EVT_菜单(wxID_关于,最小帧::OnAbout)
EVT_菜单(wxID_退出,最小帧::OnQuit)
结束事件表()
MinimalFrame::MinimalFrame(常量wxString和标题)
:wxFrame(0,wxID_ANY,title)
{
std::自动文件菜单(新wxMenu);
文件菜单->附加(wxID\U退出,L“E&xit\tAlt-X”,
L“终止最小示例”);
std::auto_ptr帮助菜单(新wxMenu);
帮助菜单->附加(wxID\u ABOUT,L“&ABOUT\tF1”,
L“显示关于对话框”);
标准::自动菜单栏(新的菜单栏);
bar->Append(fileMenu.get(),L“&File”);
fileMenu.release();
bar->Append(helpMenu.get(),L“&Help”);
helpMenu.release();
SetMenuBar(bar.get());
释放杆();
创建状态栏(2);
SetStatusText(L“欢迎使用wxWidgets!”);
}
无效最小帧::OnAbout(wxCommandEvent&e)
{
wxMessageBox(L“关于我的一些文本!”,L“关于”,wxOK,this);
}
void MinimalFrame::OnQuit(wxCommandEvent&e)
{
Close();
}
bool-Minimal::OnInit()
{
std::自动ptr主机(
新的最小框架(L“最小wxWidgets应用程序”);
大型机->显示();
mainFrame.release();
返回true;
}
这个最小程序的重量为2.4MB!(可执行压缩会将其降低到半MB左右,但仍然很大!)(我必须静态链接,因为此应用程序需要部署单个二进制xcopy,所以C运行时和wxWidgets本身都设置为静态链接)


有什么减少这个的建议吗?(我使用的是Microsoft Visual Studio 2010)

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

我认为2.4MB的静态链接应用程序是相当不错的IMHO


更新:可能会带来一些安慰…

您应该禁用所有不需要的功能,方法是将
include/wx/msw/setup.h
中的大部分
wxUSE\u XXX
设置为0。但即使如此,您仍然不会有任何接近90KB的内容


wxWidgets从来没有针对大小进行过优化,因此如果这是您最关心的问题,那么它可能不适合您(当然,除非您想自己做一些这方面的工作,这将是非常受欢迎的)。然而,在实践中,这从来都不是一个问题,也许只有极少数人例外

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

/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

如果您尝试检查可执行文件,您会注意到它的大小现在要小得多。

使用WTL的同一个应用程序的大小是90 kb。我认为2.4MB并不合适。WXWIDGET提供跨平台支持是很好的,但不是以大小为27倍的气球为代价的。这将使我吃惊的是C++代码,作为一个简单的IoSt流“hello World”编译为 Cl/Mt/O1 Meavy.CPP/Link /OUT:TEX.exe < /Cl> >在MSVC 10上提供了115 KB的大小。你确定WTL项目是完全静态编译的吗?@rubenvb:是的,我确定。命令行(由VC10生成):。可能大小的差异是由链接时代码生成造成的,而您的命令行不会调用链接时代码生成。(实际上,我没有保留我的另一个90kb示例;我创建了一个新项目来拉这些命令行。它的功能比wxWidgets minimal应用程序(没有菜单或任何东西)稍微少一些,但现在是67kb)我们不要忘记,大多数依赖win的东西都使用Windows附带的库,这就是为什么使用一些Microsoft制造的技术会使生成的可执行文件如此之小的原因之一。例如,如果你只使用普通的Win32制作一个hello world应用程序,你只会在可执行文件上获得几Kbs的内存。。。