战魂小筑

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

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

引擎中的每个工程均以静态库方式链接到最后的exe. 代码中包含有静态类成员,第一次运行正常,后面不知什么原因, 这些静态类成员不会被初始化, 在 crtexec.c 的CRT 初始化全局类成员函数

static void __cdecl _initterm (
#endif  /* CRTDLL */
        _PVFV * pfbegin,
        _PVFV * pfend
        )
{
        /*
         * walk the table of function pointers from the bottom up, until
         * the end is encountered.  Do not skip the first entry.  The initial
         * value of pfbegin points to the first valid entry.  Do not try to
         * execute what pfend points to.  Only entries before pfend are valid.
         */
        while ( pfbegin < pfend )
        {
            /*
             * if current table entry is non-NULL, call thru it.
             */
            if ( *pfbegin != NULL )
                (**pfbegin)();
            ++pfbegin;
        }
}

 

 

这个函数会初始化所有链接到exe中的全局函数构造, 跟踪这个地方, 发现,只有1个lib中的能被正确调用,但是出问题的那个lib中所有构造都不能被调用. 尝试调整编译顺序无果

唯一的方法只有修改架构为在winmain内进行构造

如果有这方面调试经验的同学可以回帖,谢谢

posted on 2010-04-23 17:47 战魂小筑 阅读(1326) 评论(6)  编辑 收藏 引用 所属分类: 程序调试技术C++/ 编程语言

评论

# re: CRT未构造全局对象问题 2010-04-23 19:45 Lo
一般是编译库文件的vs版本不对
比如vc2003用vc6编译的库 就会出这样的问题  回复  更多评论
  

# re: CRT未构造全局对象问题 2010-04-23 20:37 Davy.xu
都是vs2008工程  回复  更多评论
  

# re: CRT未构造全局对象问题 2010-04-23 20:54 Davy.xu
都是vs2008工程

换过机器编译,一样的结果. 具体研究了下, 换了一个CPP就会解决这个问题.但是在原来的CPP无论构造多少都无法初始化  回复  更多评论
  

# re: CRT未构造全局对象问题 2010-04-24 02:32 陈梓瀚(vczh)
一直都坚持在winmain初始化并且尽可能减少全局变量的vczh飘过  回复  更多评论
  

# re: CRT未构造全局对象问题 2010-04-29 19:56 zhuxinbin2000@gmail.com
静态类成员除非在类外面有定义,否则是不会在_initterm里面初始化的,就是说只有被使用了才会初始化。   回复  更多评论
  

# re: CRT未构造全局对象问题 2010-06-22 15:21 小祥
@zhuxinbin2000@gmail.com

应该是被VC优化掉了,说明这些变量没有用到。
  回复  更多评论
  


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