静态库的静态成员

时间:2012-05-12 07:20:31

标签: c++ static-libraries static-members

我有静态库和静态成员。该库静态链接到主应用程序及其插件之一。看起来像静态变量在main(应用程序)和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之前,第二个 - 当动态库加载时。静态类的静态库链接到主应用程序和动态库。

P.S。我的问题中有太多的词“静态”,我知道=)

1 个答案:

答案 0 :(得分:0)

是的,你有两个辅助类的实例。

DLL应链接到链接静态类的可执行文件,并使用它来解析帮助程序类。不要将DLL与静态库链接,而是将其与可执行文件本身链接。