我创建了一个可以加载不同共享库(problem1.so、problem2.so 等(的程序。在这个程序中,我有一个用作全局变量的 Config 对象。我想知道如何在我的程序和共享库之间共享全局变量。目前,我已经这样做了:
配置.hh
struct Config {
Config();
int test;
};
extern Config config;
配置.cpp
#include "Config.hh"
Config config;
Config::Config() : test(3) {} // set test to 3
问题1.hh//我的一个共享库的部分主类
#include "Config.hh"
class Problem {
Problem();
};
问题 1.cpp//部分文件
#include "Problem.hh"
Problem::Problem() {
std::cout << config.test << std::endl; // print 0 and not 3
}
问题是 Problem 构造函数打印 0 而不是 3,就好像我的全局变量(在共享库之外完美工作(在共享库中重置一样。有人知道如何解决这个问题吗?
编辑:"问题"对象不是全局的
猜猜你也有Problem
对象作为全局对象,并在与config
不同的源文件中定义。全局对象的初始化经历两个阶段,即静态初始化和动态初始化。
根据 cpp 偏好(强调我的(:
静态初始化
...
2( 对于所有其他非局部静态变量和线程局部变量,零 进行初始化。在实践中,变量将 被零初始化放置在程序的.bss段中 映像,不占用磁盘上的空间,并且作系统清零 加载程序时。
...
动态初始化
...
2( 有序动态初始化,适用于所有其他 非局部变量:在单个翻译单元中,这些变量 按其定义在源中出现的确切顺序进行初始化 法典。不同转换中静态变量的初始化 单位是不确定的顺序。线程本地初始化 不同翻译单元中的变量是未排序的。
因此,在您的情况下,在调用 Config
和 Problem
构造函数(相当于动态初始化(之前,静态初始化零初始化test
初始化为0
。在动态初始化阶段,如果config
和全局Problem
对象是在单独的cpp
文件(翻译单元(中定义的,则无法知道首先调用谁的构造函数。如果在 config
之前首先调用 Problem
对象的构造函数,则在Problem
构造函数中,您将看到由于静态初始化而0
test
。