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

时间:2014-05-13 08:50:58

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

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

用于更改变量的函数在一个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变量都会有不同的地址。为什么会这样?我需要所有库函数来访问相同的 vars变量!

1 个答案:

答案 0 :(得分:1)

即使该语言与所谓的“C ++”几乎没有相似之处,即使问题严重不足(什么类型的库?),但问题是众所周知的,它是可以回答的。

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

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

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


顺便说一下,当你为一个变量提供setter和getter时,确实可以直接访问变量也没什么意义。那是在惹麻烦。但是,首先,使用全局变量也是一个问题。