У меня есть статическая библиотека со статическим членом. Эта библиотека статически связана с основным приложением и одним из его плагинов. Похоже, статическая переменная инициализируется как в основной (приложение), так и в dll (плагин).
Вопрос: как избежать повторной инициализации статической переменной при загрузке динамической библиотеки. Или мне не хватает чего-то простого?
Дополнительная информация:
Это простая статическая библиотека, которая содержит статический член, а также методы получения и установки:
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. в моем вопросе слишком много слов "статика", я знаю =)