战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  251 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

 

工程结构

包含有静态库

motion.lib 一个UI逻辑的库

HGErender.lib  使用一个motion的接口实现的HGE渲染器,与motion.lib没有链接和依赖关系

一个exe静态链接motion.lib和HGErender.lib

 

motion中加入了一些flash支持,将flash的包含放到了预编译头文件,这部分头文件exe是没有引用的

表现症状

exe可以正常运行,但是在motion中新添加的flash类实例化后无法看到成员

重编,重新link,清空重编无用

换用vs2005,依然无用,但是报了一个Error: error in OMF type information 错误

解决方法

尝试将flash包含到预编译头的文件放到对外包含中,让exe也能看到这一部分

问题解决

分析

VS的调试系统并不是完全开发,因此我们只能从一些表象来分析一些调试器原理及行为

这个bug的原因就在 作为调试入口的exe并没有获得完全的motion里调试的信息。如果将motion作为dll加载,理论分析不会出现这种问题。dll将被作为一个单独的调试入口,需要单独加载独立的pdb。

本例中,静态库中的调试信息并没有链接到exe,因此看不到成员的任何信息

扩展

大多数的游戏或应用程序都是使用静态库来做链接,这样无论是编写还是代码安全都有所兼顾。但对于工程模块之间的互相隔离,C/C++静态库本身的毛病(CRT内存分配及静态,全局变量问题)就变得尤为严重。

而使用动态链接库的接口方式也是有一部分程序这样使用的,如果为了安全或者加密,可以将动态链接库放到自己的包内,使用从内存读取dll的技术,这样安全,工程架构又清晰

posted on 2009-07-17 16:06 战魂小筑 阅读(445) 评论(0)  编辑 收藏 引用 所属分类: 程序调试技术

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理