Статический инициализатор разделяемой библиотеки внутри динамической библиотеки

Итак, у меня есть статическая библиотека (MacOS, библиотека .a). Он написан на C ++ и содержит статические инициализаторы в своем коде:

//myclass.hpp
class MyClass {
...
static MyClass *defaultValue_;
static MyClass *newInitialDefaultValue();
...
}
...
//myclass.cpp
MyClass *MyClass::defaultValue_ = newInitialDefaultValue();
...

Я связываю свою библиотеку .dylib с этой .a lib. К сожалению, когда мой файл .dylib загружен, нет MyClass::newInitialDefaultValue() это называется.
Какие могут быть причины и как с этим бороться?

я пробовал -all_load а также -force_load флаги линкера без удачи.

0

Решение

Флаги компоновщика all_load и force_load обеспечивают только то, что код связан с двоичным файлом. Я не думаю, что эти флаги помогут вам.

Единственная гарантия, на которую, я думаю, вы можете рассчитывать, заключается в том, что ваш инициализатор в myclass.cpp будет вызываться до вызова любого другого кода в том же файле cpp. Вам необходимо предоставить доступ к вашему умолчанию по умолчанию через функцию. Это было бы похоже на шаблон Singleton. Например:

//myclass.hpp
class MyClass {
...
static MyClass *getDefaultValue();
...
}
...
//myclass.cpp
static MyClass* defaultValue_; // Note that this is not a member variable
MyClass* MyClass::getDefaultValue() {
if (defaultValue_ == nullptr) {
defaultValue_ = newInitialDefaultValue();
}
return defaultValue_;
}
...

ПРИМЕЧАНИЕ. Я не пытался сделать этот поток безопасным или обрабатывать ошибки.

Теперь defaultValue_ по-прежнему не будет автоматически инициализироваться при загрузке библиотеки. Но так как только вызывающие пользователи имеют доступ через getDefaultValue (), он гарантированно инициализируется при обращении к нему.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]