【问题标题】:Access the same namespace from different libraries从不同的库访问相同的命名空间
【发布时间】:2014-05-13 08:50:58
【问题描述】:

我构建了几个库(静态库和动态库),它们都需要访问包含命名空间全局变量的命名空间。

更改变量的函数在一个 cpp 文件中定义。如果库中的函数访问其中一个函数,它似乎会创建整个 cpp 文件的本地副本,包括所有变量(可能还有函数)。这意味着,每个库都访问不同地址的变量,导致一团糟,因为变量必须由所有库共享。我该如何解决这个问题?

源代码,精简到基本:

//include.h
namespace myns {
    extern int vars;
}

.

//include.cpp
#include <myns/include.h>
namespace myns {
    int vars;
    void MyClass::setVars(int var) {
        vars = var;
    }
}

.

//myclass.h
namespace myns {
    class MyClass {
        void setVars(int var);
    }
}

.

//myclass.cpp.in
//This will be generated by CMake and then compiled into a library
#include <myns/@package@/myclass.h>
namespace myns {
    namespace @package@ {
        class __declspec(dllexport) MySubclass : public MyClass {
            MySubclass();
        }
        MySubclass::MySubclass() {
            setVar(@value@);
        }
    }
}
using namespace myns;
extern "C" __declspec(dllexport) void exported_function() {
    new MySubclass();
}

每次调用exported_function() 时,vars 变量都会有不同的地址。为什么会这样?我需要所有库函数来访问 same vars 变量!

【问题讨论】:

    标签: c++ namespaces shared-libraries static-libraries


    【解决方案1】:

    尽管该语言与所谓的“C++”几乎没有相似之处,而且即使该问题严重未明确(什么样的库?),但该问题已广为人知,可以回答。

    简而言之,每个 Windows DLL 都有自己的内部变量等(Windows DLL 更类似于可执行文件,而不是 C++ 库)。

    请注意,标准 C++ 不支持动态加载的库,除了一个关于全局初始化顺序的神秘小声明。

    一种解决方案是将共享状态放在它自己的 DLL 中。


    顺便说一句,当您为变量提供 setter 和 getter 时,将其直接访问并没有什么意义。那是自找麻烦。但是,首先,使用全局变量也是自找麻烦。

    【讨论】:

    • 感谢您的回答。我已经怀疑每个 DLL 都有自己的范围。很抱歉问得不清楚,但我不知道如何正确分解问题,因为我什至不确定是什么原因造成的。我正在重写一个项目(最初是为 Linux 编写的)以在 Windows 上使用。将状态放入 DLL 到底是什么意思?这不会使问题恶化,因为它将是一个具有自己作用域的附加 DLL?
    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多