主题:如何减少使用SOUI开发的产品的编译的EXE的大小

admin 2018年12月08日 172

SOUI是一个DirectUI项目,目前随着越来越多的控件的加入,使用SOUI开发的产品的EXE文件也在增加,问题的关键在于链接了大量不需要的控件进来。

有没有办法在不修改代码的情况下减少EXE体积呢?

 答案是肯定的。

但是方法可能有点麻烦。

 首先要把整个SOUI项目使用模块全静态的方式进行编译。

这样在生成EXE的时候才能有选择的链接必须的代码。

 然后是有选择的注册系统提供的控件。 

新版本的SOUI的SApplication构造函数中多了一个参数 pSysObjRegister:


/**
     * SApplication
     * @brief    构造函数
     * @param    IRenderFactory * pRendFactory --  渲染模块
     * @param    HINSTANCE hInst --  应用程序句柄
     * @param    LPCTSTR pszHostClassName --  使用SOUI创建窗口时默认的窗口类名
         * @param    ISystemObjectRegister *pSysObjRegister -- 系统控件注册器
     *
     * Describe  
     */
    SApplication(IRenderFactory *pRendFactory,HINSTANCE hInst,LPCTSTR pszHostClassName=_T("SOUIHOST"), ISystemObjectRegister *pSysObjRegister = new SObjectDefaultRegister());


如果不提供这个参数,则自动注册全部系统控件。有了这个参数,你可以实现这个参数需要的接口,在里面有选择的注册需要的控件。这样那些不需要的控件就不会注册到APP中了,也就减少了这部分控件的代码。 

示例可以参考demos/360/360.cpp/


//注册系统控件,只注册当前APP里需要的控件,可以减小静态链接生成的APP的体积。
class CSystemObjectRegister : public TObjRefImpl<ISystemObjectRegister>
{
public:
        void RegisterWindows(SObjectFactoryMgr *objFactory)
        {
                objFactory->TplRegisterFactory<SWindow>();
                objFactory->TplRegisterFactory<SPanel>();
                objFactory->TplRegisterFactory<SStatic>();
                objFactory->TplRegisterFactory<SButton>();
                objFactory->TplRegisterFactory<SImageWnd>();
                objFactory->TplRegisterFactory<SProgress>();
                objFactory->TplRegisterFactory<SImageButton>();
                objFactory->TplRegisterFactory<SCheckBox>();
                objFactory->TplRegisterFactory<SIconWnd>();
                objFactory->TplRegisterFactory<SRadioBox>();
                objFactory->TplRegisterFactory<SLink>();
                objFactory->TplRegisterFactory<SGroup>();
                objFactory->TplRegisterFactory<SAnimateImgWnd>();
                objFactory->TplRegisterFactory<SScrollView>();
                objFactory->TplRegisterFactory<SToggle>();
                objFactory->TplRegisterFactory<SCaption>();
                objFactory->TplRegisterFactory<STabCtrl>();
                objFactory->TplRegisterFactory<STabPage>();
                objFactory->TplRegisterFactory<SHeaderCtrl>();
                objFactory->TplRegisterFactory<SListCtrl>();
        }

        void RegisterSkins(SObjectFactoryMgr *objFactory)
        {
                objFactory->TplRegisterFactory<SSkinImgList>();
                objFactory->TplRegisterFactory<SSkinImgFrame>();
                objFactory->TplRegisterFactory<SSkinButton>();
                objFactory->TplRegisterFactory<SSkinScrollbar>();
        }

        void RegisterLayouts(SObjectFactoryMgr *objFactory)
        {
                objFactory->TplRegisterFactory<SouiLayout>();
        }
};

在这里只注册了一种布局,系统支持的线性布局,网格布局都没有注册。