C++ 从不同的库访问相同的命名空间

C++ 从不同的库访问相同的命名空间,c++,namespaces,shared-libraries,static-libraries,C++,Namespaces,Shared Libraries,Static Libraries,我构建了几个库(静态库和动态库),它们都需要访问包含名称空间全局变量的名称空间 用于更改变量的函数在一个cpp文件中定义。如果库中的函数访问其中一个函数,它似乎会创建整个cpp文件的本地副本,包括所有变量(可能还有函数)。这意味着,每个库在不同的地址访问一个变量,结果是一团糟,因为这些变量必须由所有库共享。我怎样才能避开这件事 源代码,简化为基本代码: //include.h namespace myns { extern int vars; } //myclass.cpp.in

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

用于更改变量的函数在一个cpp文件中定义。如果库中的函数访问其中一个函数,它似乎会创建整个cpp文件的本地副本,包括所有变量(可能还有函数)。这意味着,每个库在不同的地址访问一个变量,结果是一团糟,因为这些变量必须由所有库共享。我怎样才能避开这件事

源代码,简化为基本代码:

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

//myclass.cpp.in
//这将由CMake生成,然后编译到库中
#包括
名称空间myns{
名称空间@package@{
类uu declspec(dllexport)MySubclass:public MyClass{
MySubclass();
}
MySubclass::MySubclass(){
setVar(@value@);
}
}
}
使用名称空间myns;
外部“C”\u declspec(dllexport)void exported\u函数(){
新的MySubclass();
}

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

尽管该语言与所谓的“C++”几乎没有相似之处,而且这个问题也严重不够明确(什么样的库?),但这个问题是众所周知的,它是可以回答的

简而言之,每个Windows DLL都有自己的内部变量等(Windows DLL比一个C++库更类似于一个可执行文件)。 <>注意,标准C++不支持动态加载的库,除了一个关于全局初始化顺序的单个小语句。 一种解决方案是将共享状态放在自己的DLL中



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

谢谢您的回答。我已经怀疑每个DLL都有自己的作用域。很抱歉不清楚地问了,但我不知道如何正确地解决这个问题,因为我甚至不知道是什么原因造成的。我正在重写一个在Windows上使用的项目(最初是为Linux编写的)。您将状态放入DLL的确切含义是什么?这不会使问题恶化吗,因为它将是一个具有自己范围的传统DLL?
//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();
}