我构建了几个库(静态和动态的),它们都需要访问包含命名空间全局变量的命名空间。
用于更改变量的函数在一个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
变量!
答案 0 :(得分:1)
即使该语言与所谓的“C ++”几乎没有相似之处,即使问题严重不足(什么类型的库?),但问题是众所周知的,它是可以回答的。
简而言之,每个Windows DLL都有自己的内部变量等(Windows DLL更类似于可执行文件而不是C ++库。)
请注意,标准C ++不支持动态加载的库,除了关于全局初始化顺序的单个神秘的小语句。
解决方案是将共享状态放在自己的DLL中。
顺便说一下,当你为一个变量提供setter和getter时,确实可以直接访问变量也没什么意义。那是在惹麻烦。但是,首先,使用全局变量也是一个问题。