【问题标题】:c++ use a global variable from a program in a shared libraryc ++在共享库中使用程序中的全局变量
【发布时间】:2016-01-30 19:44:14
【问题描述】:

我创建了一个可以加载不同共享库(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

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,就好像我的全局变量(在共享库之外完美工作)在共享库中被重置。有人知道如何解决这个问题吗?

编辑:“问题”对象不是全局对象

【问题讨论】:

  • 您使用的是全局Problem 对象吗?
  • 可能是全局变量的初始化顺序有问题

标签: c++ global-variables shared-libraries


【解决方案1】:

猜想您也将Problem 对象作为全局对象,并在与config 不同的源文件中定义。全局对象的初始化分为静态初始化和动态初始化两个阶段。

根据cppreference(强调我的):

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

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

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    相关资源
    最近更新 更多