`
javahigh1
  • 浏览: 1288165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

静态链接库--类工厂的杯具

 
阅读更多

静态链接库--类工厂的杯具
关键字:静态库 全局 变量 不初始化 类工厂 不注册

原文发表于: http://www.hellocpp.net/Articles/Article/730.aspx

今天又碰到一个极其BT的问题,从想不通到诧异,从诧异到无奈。只想温柔的说一声:靠!
其实这个故事,以前在做Linux的时候就发现过,没有深入研究,今天经不起真相的诱惑,为了故事的连贯性,我从今天的故事开始。

故事的前奏:
我在设计我的字体系统,场景管理的Node系统,Enity系统的时候大量使用了Factory模式,通过一个String的id就可以创建出一个类来。比如
ISceneNode* pActorNode = xSceneNodeManager::singleton()->createInstance(L"xActorNode", m_pSceneGraph);
这是一个非常美好的设计。将来我要扩展的时候,只要写一个xXXXXSceneNodeFactory。并写一个全局的factory对象,在对象构造函数或者用其他方法注册到xSceneNodeManager中。ISceneNode的扩展是0耦合!!这就是我想要的。
这个美化的故事在我一直使用大块头的dll引擎的时候一直都这样美好着。

故事的发展:
前两天我已经顺利把引擎插入到ATL ActiveX控件中,为了进一步减少体积,考虑到我的dll为了避免安装vc运行库的额外开销,都是采用静态链接CRT的模式,所以我决定,将引擎的所有插件代码都编译到static lib中,并将lib链接到ocx中,这样体积能小很多。
经过一番折腾,我终于将ocx编译出来,整个系统只有一个ocx,又是一个美好的故事啊。。。我开始陶醉:从5个dll,7M大小,直线减少到1.3M。很成功。
但是,,,,美化的时光很短暂,我很快发现,我的ocx根本没法运行!!。

故事的高潮:
经过一番调试,我发现,我的Font系统的类工厂,一个都没有注册过。
神奇!!!!
开始我怀疑我的类工厂有问题,将static改成extern ,去掉static。甚至还试过这样的方法:

class xFT2FontFactory : public IFontFactory
{
int type();
};

xFT2FontFactory g_FT2Fct;
const int xFT2FontFactoryInitV = g_FT2Fct.type();

不管用啥方法,我的类工厂就是不肯自动注册。

无语中...
我google了一下。好不容易找到一篇文章,作者显然也碰到跟我类似的问题:
http://www.cppblog.com/kevinlynx/archive/2010/01/17/105885.aspx
当我的引擎编译成静态库的时候,在链接的过程中,vc只链接了那些我用到的符号表。那些模块中的符号表,如果在别的模块里没用到,那么压根就不会代码整合过来

举例:
我的静态库:
xEvol3D_Release_Static.lib ( xFontRender.obj , xFontManager.obj , xFT2Font.obj , xBmpFont.obj )

我将在 xEvol3D_WebControl.ocx中使用 xEvol3D_Release_Static.lib
当然,由于我“优秀的”设计模式,在 xEvol3D_WebControl.ocx 中我显然不会直接去使用xFT2Font.obj和xBmpFont.obj中的对象。但是xFT2Font.obj中的静态变量会自动注册类工厂到xFontManager.obj的类中,然后 xEvol3D_WebControl.ocx 通过xFontManager的接口创建出xFontRender对象来使用。
这个时候,因为 xEvol3D_WebControl.ocx 没有引用到 xFT2Font.obj 的符号,其他模块也没有引用xFT2Font.obj。于是“聪明”的连接器就把我的xFT2Font.obj给扔了。。。

无奈的结果:
我找了好多资料,还挨个看了看VC的编译设置,暂时没有发现任何地方可以“Full link all module in static lib"的选项。极其杯具。
无奈,我只能改成动态链接库。不同的时候,把插件的代码整合到一起。

后记:
1. 测试过我找到的那篇文章的方法,在其他地方强行引用 xFT2Font.obj中的符号,那么这个模块就进来了。代码也对了。但是显然我不会这样做。我这样的类太多。不现实。
2. 想起<Unix编程艺术>里的一个条款:越是花哨的东西越是容易出问题。看来真是报应啊。
3. 从7M减少1.3M也是个幻觉。好多代码都没进去。当然小了。sigh!
4. Linux也有同样的问题。我用gcc的时候,也发现过类似的问题。

分享到:
评论

相关推荐

    电子政务-杯具电动清洁器.zip

    在“电子政务-杯具电动清洁器.zip”这个压缩包中,我们可以推测它可能包含了关于电子政务在特定领域的应用案例,即“杯具电动清洁器”。虽然这个主题看似与传统意义上的电子政务不太直接相关,但可能是通过数字化...

    电信设备-一种可动态传播信息的双层杯具.zip

    标题“电信设备-一种可动态传播信息的双层杯具.zip”即是一例,它揭示了一个融合电信技术与传统器物的新型智能设备。这类设备能够实时地收集与传播信息,为我们打开了一个全新的智能生活世界。 首先,我们来探讨...

    专题资料(2021-2022年)酒店客房杯具消毒制度.doc

    在众多服务细节中,客房内杯具的清洁与消毒是至关重要的环节,它不仅关乎卫生标准的实现,更体现了酒店对宾客健康的尊重与保障。因此,对《酒店客房杯具消毒制度详解》进行深入解读,有助于酒店提升服务质量,加强...

    杯具的ASP - ASP参考手册

    什么是 VBs cript? 在 HTML 页面中添加 VBs cript 代码 VBs cript 基础 VBs cript 数据类型 VBs cript 变量 VBs cript 常数 VBs cript 运算符 使用条件语句 使用循环语句 ...在 VBs cript 中使用对象

    【酒店客房杯具消毒制度】客房杯具消毒流程..doc

    特别是对于那些与客人直接接触的物品,如客房内的杯具,其消毒制度就显得尤为关键。保证每一件杯具达到卫生安全的标准,不仅是维护酒店声誉的需要,更是对客人健康负责的必要措施。以下,我们将深入探讨酒店客房杯具...

    杯具消毒的标准与程序实用.pdf

    杯具消毒是酒店客房服务中的重要环节,它直接关系到客人的健康和使用体验。标准的杯具消毒程序包括多个步骤,确保每一步都严格按照卫生规范执行,为客人提供安全、干净的杯具。 首先,脏杯去渍是消毒过程的第一步。...

    杯具消毒的标准与程序借鉴.pdf

    杯具消毒是酒店客房服务中的重要环节,它直接关系到客人的健康和使用体验。以下是对"杯具消毒的标准与程序"的详细说明: 1. **去除污渍**:在消毒之前,首先需要使用清洁剂清洗杯具,去除杯壁上的污渍、茶渍等残留...

    杯具消毒流程.doc

    其中,杯具作为直接与客人接触的重要物品,其清洁和消毒流程更是不容忽视。本文将详细介绍杯具消毒的标准流程,目的是使每一款被使用过的杯子都能达到既定的卫生标准,保障客人的健康安全。 在开始消毒前,首先需要...

    酒店客房杯具消毒制度.pdf

    酒店客房杯具消毒制度是确保住宿卫生安全的重要环节,它涉及到客人的健康和酒店的声誉。以下是这份制度的详细解析: 一、清洗消毒间的配置 酒店需设立专门的清洗消毒间,一般建议每层楼设置一个,以确保杯具得到...

    杯具清洗消毒卫生制度扫描.pdf

    《公共场所杯具清洗消毒卫生制度详解》 在餐饮业及公共服务场所中,杯具的卫生清洁与消毒至关重要,它直接关系到消费者的健康安全。本文主要围绕《杯具清洗消毒卫生制度》进行详细解读,旨在提供一套标准的操作规程...

    宾馆杯具消毒规范.pdf

    宾馆杯具消毒规范是确保住宿环境卫生安全的重要环节。这一规范主要涵盖了杯具、其他客房物品以及棉织品的消毒流程,旨在消除潜在的病菌,保障客人健康。 首先,消毒员需要严格按照一洗、二清、三消毒、四保洁的规程...

    网友原创版《杯具》mp3

    2009年,一个新词汇“杯具”横空出世,迅速在网络上传播开来,成为了表达悲剧色彩的新代名词。这个词汇源自于对“悲剧”一词的谐音调侃,它不仅仅是一个普通的词,更是一种情绪的表达,反映出现代人在压力和挑战面前...

    C#杯具空战游戏

    1. **C#编程基础**:C#是微软公司推出的一种面向对象的编程语言,它支持类、接口、继承等面向对象特性,同时也具有垃圾回收机制和强大的类型检查系统。游戏的整个框架和逻辑都是基于C#进行编写的,学习者可以通过这...

    NewsRelease.zip

    在"NewsRelease"项目中,Maven管理了所有依赖库,如Spring Boot、MySQL连接器等,通过POM.xml文件定义项目结构和依赖关系,使得团队协作更加顺畅。 三、数据库设计与使用 MySQL是一个广泛使用的开源关系型数据库...

    xx宾馆杯具清洗消毒卫生操作规程.docx

    因此,《xx宾馆杯具清洗消毒卫生操作规程》的出台,具有重要的实践意义和价值。 本操作规程以“一冲、二洗、三消毒、四保洁”的原则为指导,制定了一套科学、严谨的杯具清洗消毒流程,确保每一件宾客使用的杯具都能...

    “杯具”的完整发展史!网络新词越来越有内涵了!.doc

    其中,“杯具”这个网络新词,不仅从诞生到广泛应用的过程中,展现了网络语言的创新力量和网民的集体智慧,更折射出社会心态的变迁以及现代人对生活态度的微妙调整。让我们一起回顾“杯具”的完整发展史,探索它如何...

    七彩杯具背景PPT精美模板下载

    【标题】"七彩杯具背景PPT精美模板下载"所蕴含的知识点主要集中在PPT设计和视觉传达领域。在日常工作中,制作一份引人注目的PPT是必不可少的技能,尤其是在自我介绍场合,它能有效地展示个人风格、专业能力和沟通...

    ROS流控脚本 代号“杯具”免费版

    ROS流控脚本 代号“杯具”免费版 ROS流控脚本 代号“杯具”免费版

    专题讲座资料(2021-2022年)公共场所消毒管理制度.doc

    - 清洗流程:公用杯具等需按照严格的清洗消毒程序操作,如一洗二过三消毒等,确保每次使用后都进行消毒。 - 运输管理:使用密闭容器运输,区分干净和使用过的用品,避免交叉污染。 - 数量储备:储备充足,至少...

Global site tag (gtag.js) - Google Analytics