我是一个有用的助手,可以为您翻译文本。
我有一个带有静态成员的静态库。该库被静态链接到主应用程序和其中一个插件中。看起来静态变量在主应用程序和dll(插件)中都进行了初始化。
问题:如何避免动态库加载时静态变量重新初始化。或许我错过了一些简单的东西?
更多信息:
这是一个简单的静态库,包含静态成员及其getter和setter:
orbhelper.h
class ORBHelper {
static std::string sss_;
public:
static std::string getStr();
static void setSTR(std::string str);
};
orbhelper.cpp
std::string ORBHelper::sss_ = "init";
static std::string ORBHelper::getStr()
{
std::cerr << "get " << sss_.c_str() << std::endl;
return sss_;
}
static void ORBHelper::setSTR(std::string str)
{
sss_ = str;
std::cerr << "set " << sss_.c_str() << std::endl;
}
这个库被用在main.cpp和另一个动态库中,这个动态库被加载到main中。 在main.cpp中,我设置了一个静态字符串,并且在其中一个动态库函数中,我想要获取它。
在main中设置静态变量:
main.cpp
...
ORBHelper::setStr("main");
std::cerr << ORBHelper::getStr().c_str() << std::endl; //prints 'main'
//then loading library
...
接下来在dll中获取变量的值:
hwplugin.cpp
...
std::cerr << ORBHelper::getStr().c_str() << std::endl; //prints 'init' instead of 'main'
...
看起来静态变量被初始化了两次。第一次是在main.cpp之前,第二次是在动态库加载时。静态库中的静态类链接到主应用程序和动态库上。
注:我的问题中有太多“静态”这个词了,我知道 =)