Вопрос по c++ – Статические члены статических библиотек

4

У меня есть статическая библиотека со статическим членом. Эта библиотека статически связана с основным приложением и с одним из его плагинов. Выглядит как статическая переменная, инициализирующаяся как в main (приложение), так и в dll (плагин).

Question: Как избежать повторной инициализации статических переменных при динамической загрузке библиотеки. Или я могу упустить что-то простое?

More information:

Это простая статическая библиотека, которая содержит статический член, а также его метод получения и установки:

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'
...

Похоже, статическая переменная была инициализирована дважды. Первый & # x2013; перед main.cpp, second & # x2013; когда динамическая библиотека загружена. Статическая библиотека со статическим классом, связанная как с основным приложением, так и с динамической библиотекой.

Постскриптум слишком много слов "статично" в моем вопросе знаю =)

У меня недавно была такая же проблема (stackoverflow.com/q/10520587/509868); получил два полезных решения (1: превратить статическую библиотеку в (вторую) DLL; или 2: добавить функцию в существующую DLL, которая инициализирует проблемные вещи в статической библиотеке) anatolyg
Если вы ссылаетесь статически, вы, вероятно, получитеtwo экземпляры переменной, один в exe и один в DLL. Bo Persson
Я проверил адрес переменной (printf (& quot;% p & quot; & amp; sss);) и обнаружил, что это та же самая переменная. uni
Если у вас есть загрузка во время выполнения, может быть предпочтительнее создать некоторый объект глобального контекста в вашем основном приложении, а затем передать ссылку или указатель на него в вашу динамическую библиотечную инициализацию. Объект контекста может легко содержать достаточно информации о состоянии, чтобы каждая загруженная библиотека могла выяснить, нужно ли ей выполнять больше работы. Kerrek SB

Ваш Ответ

1   ответ
0

DLL должна быть связана с исполняемым файлом, который связывает статический класс, и использовать его для разрешения вспомогательного класса. Не связывайте DLL со статической библиотекой, а связывайте ее с самим исполняемым файлом.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded uni

Похожие вопросы