C++ c++;使用共享库中程序的全局变量
我创建了一个可以加载不同共享库的程序(problem1.so、problem2.so等)。在这个程序中,我使用了一个Config对象作为全局变量。我想知道如何在我的程序和共享库之间共享全局变量。目前,我已经做到了: Config.hhC++ 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() :
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?可能是全局变量的初始化顺序有问题