0

所以我有一個靜態庫(MacOS,.a庫)。它是用C++編寫,並在它的代碼一樣,沒有靜態初始化:動態庫內共享庫的靜態初始化器

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

我連接我的圖書館名爲.dylib對這個.A庫。不幸的是,當我的.dylib文件被加載時,沒有調用MyClass::newInitialDefaultValue()。 可能是什麼原因以及如何處理?

我試過-all_load-force_load連接器標誌沒有運氣。

回答

1

all_load和force_load鏈接器標誌只確保代碼鏈接到二進制文件中。我不認爲這些標誌會幫助你。

我認爲你可以依靠的唯一保證是在調用同一cpp文件中的任何其他代碼之前調用myclass.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(),它保證在訪問它時被初始化。

+0

非常感謝您的見解!不幸的是,這個錯誤發生在構建圖書館的系統中,新版本在不同的位置放置了圖書館的二進制文件,而且我還在使用舊的二進制文件。它發生... – peetonn