у меня есть следующая проблема с общими библиотеками
создать общий библиотека
class A
{
static int callCount;
A() { callCount++; }
}
int A:callCount = 0;
class Main
{
Main()
{
A a1();
A a2();
}
}
Теперь создайте процесс, который загружает эту общую библиотеку несколько раз, и я хотел бы, чтобы callCount принадлежал только общей библиотеке, а не всему процессу
dlopen("shared.so", RTLD_LAZY);
// after some code i can construct Main()
// and now i will open the shared object again
dlopen("shared.so", RTLD_LAZY);
// now if i construct Main from the new library i want to have a new
// initialized callCount eq 0 but its 2
Как я могу решить эту проблему
Загрузка, а особенно перегрузка Семантика загруженных библиотек во время выполнения очень зависит от платформы и реализации. Лучше не полагаться на какое-либо глобальное состояние, а вместо этого передавать явную функцию инициализации в свою библиотеку. Может быть так:
library_context_t context;
/* dlopen, dlsym, ... */
library_init(&context);
library_do_thing(&context);
// ...
library_destroy(&context);
// maybe unload, or reuse
Linux в частности делает не перезагрузите библиотеку, которая уже была загружена.
Других решений пока нет …