其实主要问题是三个模块:
模块 a, 静态库 a
模块 b, 二进制 b, 静态引用a, 动态加载c
模块 c, 动态链接库c, 静态引用a
关键在于静态库a里有一个静态全局变量,没错就是我们的日志模块。原先的这个静态的模块中的静态全
局变量是有构造函数的,也就是构造函数干了点事情。我们都知道,程序载入在进入主函数前会依次初始
化全部的全局和静态变量。载入动态链接库时也不例外。这时候矛盾就来了,二进制b在进入主函数前会
初始化模块a中的全局变量,执行构造函数;然而载入动态链接库c时,也会启动对c内的全局变量进行初
始化,也会执行同一个对象的构造函数。这样,一个对象就会执行两次构造函数。在我们的程序里,就是
第二次执行构造函数的时候把全局变量的成员置空了。导致的结果是,我们的模块一开始有效,正常运行
了一会会之后,就失效了。当然在c里,并没有构造函数一说,对象构造时除了内存分配,什么都没干,
所以在纯c里并不会出现问题。这是碰到的问题,但是是不是在所有环境里都这样呢?或者使用静态成员
函数又如何?以下做了一个简单的测试:
一、模块a
.h文件:
struct foo_class {
int m;
foo_class();
~foo_class();
static foo_class _;
};
.cpp文件:
#include <cstdio>
#include "a.h"
foo_class foo_class::_;
foo_class::foo_class() {
m = 10;