【问题标题】:Any tips on reducing wxWidgets application code size?关于减少 wxWidgets 应用程序代码大小的任何提示?
【发布时间】:2010-12-31 05:47:31
【问题描述】:

我已经编写了一个最小的 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)

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

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

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

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

    【讨论】:

    • 使用 WTL 的同一个应用程序是 90 kb。我不认为2.4MB是体面的。 wxWidgets 提供跨平台支持很好,但不以膨胀 27 倍为代价。
    • 这会让我对 C++ 代码感到惊讶,因为使用 cl /MT /O1 main.cpp /link /out:test.exe 编译的简单 iostream“hello world”在 MSVC 10 上的大小为 115 kB。你确定 WTL 项目是完全静态编译的吗?
    • @rubenvb:是的,我确定。命令行(由 VC 10 生成):pastebin.com/kzqZXAVP。也许大小差异是由您的命令行不会调用的链接时间代码生成引起的。
    • (实际上我没有保留我的另一个 90kb 示例;我创建了一个新项目来拉出这些命令行。它的功能比 wxWidgets 最小应用程序少一点(没有菜单或任何东西),但现在是 67kb)
    • 我们不要忘记,大多数依赖于 win 的东西都使用 Windows 附带的库,这就是为什么使用一些 Microsoft 制造的技术会使生成的可执行文件如此之小的原因之一。例如,如果你只使用普通的 Win32 制作一个 hello world 应用程序,你将在可执行文件上获得几 Kbs...
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      /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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-19
        • 2016-07-06
        • 1970-01-01
        • 2013-01-13
        • 2023-03-26
        • 2021-08-29
        • 1970-01-01
        • 2020-12-12
        相关资源
        最近更新 更多