c ++使用共享库中

时间:2016-01-30 19:44:14

标签: 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() : 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;对象不是全局的

1 个答案:

答案 0 :(得分:0)

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

根据cppreference(强调我的):

  

静态初始化
  ...
  2)对于所有其他非本地静态和线程局部变量,为零   初始化发生。在实践中,变量即将到来   零初始化被放置在程序的.bss段中   映像,它在磁盘上不占用空间,并由操作系统清零   加载程序时。
  ...
  动态初始化
  ...
  2)有序动态初始化,适用于所有其他   非局部变量:在单个翻译单元内,这些变量   按照确切的顺序初始化它们的定义出现在源中   码。 在不同的翻译中初始化静态变量   单位是不确定的顺序。初始化线程本地   不同翻译单位的变量没有排序。

因此,在您的情况下,在调用ConfigProblem构造函数(相当于动态初始化)之前,静态初始化零会将test初始化为0。在动态初始化阶段,如果config和您的全局Problem对象在单独的cpp文件(翻译单元)中定义,则无法确定首先调用哪个构造函数。如果Problem对象的构造函数首先在config之前调用,那么在Problem构造函数中,您会看到test0作为结果静态初始化。