0

Итак, у меня есть статическая библиотека (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 связующие флаги без везения.

ответ

1

Флаги компоновщика 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_; 
} 
... 

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

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

+0

благодарит вас за понимание! к сожалению, ошибка была в сборке системы библиотеки, которая с новой версией размещала библиотечные двоичные файлы в другом месте, и я все еще использовал старые двоичные файлы. Бывает... – peetonn

Смежные вопросы