C++ c++;使用共享库中程序的全局变量

C++ c++;使用共享库中程序的全局变量,c++,global-variables,shared-libraries,C++,Global Variables,Shared Libraries,我创建了一个可以加载不同共享库的程序(problem1.so、problem2.so等)。在这个程序中,我使用了一个Config对象作为全局变量。我想知道如何在我的程序和共享库之间共享全局变量。目前,我已经做到了: Config.hh struct Config { Config(); int test; }; extern Config config; Config.cpp #include "Config.hh" Config config; Config::Config() :

我创建了一个可以加载不同共享库的程序(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
} 
#包括“Problem.hh”
问题::问题(){

std::cout猜测您也有
问题
对象作为全局对象,并在
config
的不同源文件中定义。全局对象的初始化经历两个阶段,即静态初始化和动态初始化

根据(我的重点):

静态初始化

2) 对于所有其他非局部静态变量和线程局部变量,零 初始化发生。实际上,变量 被初始化为零的被放置在程序的.bss段中 映像,它不占用磁盘空间,并由操作系统清零 加载程序时。

动态初始化

2) 有序动态初始化,适用于所有其他 非局部变量:在单个翻译单元内,这些变量 按照其定义在源代码中显示的确切顺序进行初始化 代码。在不同转换中初始化静态变量 单元顺序不确定。线程本地初始化 不同转换单位中的变量未排序


因此,在您的例子中,在调用
Config
Problem
构造函数之前(这相当于动态初始化),静态初始化零将
test
初始化为
0
。在动态初始化阶段,如果
config
和全局
Problem
对象在单独的
cpp
文件(翻译单位)中定义,您无法判断首先调用了谁的构造函数。如果先调用
问题
对象的构造函数,然后再调用
配置
,那么在
问题
构造函数中,您将看到
测试
由于静态初始化而成为
0

您使用的是全局
问题
obJET?可能是全局变量的初始化顺序有问题