静态库的静态成员

uni*_*uni 5 c++ static-members static-libraries

我有带有静态成员的静态库。该库静态链接到主应用程序及其插件之一。看起来像在 main(应用程序)和 dll(插件)中初始化静态变量。

\n\n

问题:如何避免动态库加载时静态变量重新初始化。或者我可能错过了一些简单的事情?

\n\n

更多信息:

\n\n

这是一个简单的静态库,包含静态成员及其 getter 和 setter:

\n\n

orbhelper.h\n

\n\n
class ORBHelper {\n    static std::string sss_;\npublic:\n    static std::string getStr();\n    static void setSTR(std::string str);\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

orbhelper.cpp\n

\n\n
std::string ORBHelper::sss_ = "init";\n\nstatic std::string ORBHelper::getStr()\n{\n    std::cerr << "get " << sss_.c_str() << std::endl;\n    return sss_;\n}\nstatic void ORBHelper::setSTR(std::string str)\n{\n    sss_ = str;\n    std::cerr << "set " << sss_.c_str() << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该库在 main.cpp 中使用,也在另一个动态库中使用,该动态库在 main.cpp 中加载。\n在 main.cpp 中我设置了静态字符串,并在一个动态库函数中我想获取它。

\n\n

在 main 中设置静态变量:

\n\n

主.cpp\n

\n\n
...\nORBHelper::setStr("main");\nstd::cerr << ORBHelper::getStr().c_str() << std::endl; //prints \'main\'\n//then loading library\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后获取dll中的变量值:

\n\n

hwplugin.cpp\n

\n\n
...\nstd::cerr << ORBHelper::getStr().c_str() << std::endl; //prints \'init\' instead of \'main\'\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来静态变量已被初始化两次。第一个 \xe2\x80\x93 在 main.cpp 之前,第二个 \xe2\x80\x93 在加载动态库时。具有链接到主应用程序和动态库的静态类的静态库。

\n\n

PS 我的问题中有太多“静态”一词,我知道=)

\n

Ant*_*ima 0

是的,您有两个助手类实例。

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