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