C++ 关于减少wxWidgets应用程序代码大小的任何提示?
我已经编写了一个最小的wxWidgets应用程序: stdafx.hC++ 关于减少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
#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”编译为