0

그래서 정적 라이브러리 (MacOS, .a 라이브러리)가 있습니다. 그것은 C++로 작성과 같은 그것의 코드에서 정적 초기화를 가지고 있어요 :이 운영자와 lib 디렉토리에 내 .dylib 라이브러리를 연결하고있어동적 라이브러리 내의 공유 라이브러리 정적 초기화 자

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

. 불행히도, .dylib 파일이로드 될 때 MyClass::newInitialDefaultValue()이 호출되지 않습니다. 이유는 무엇이며 어떻게 처리 할 수 ​​있습니까?

나는 행운이없는 -all_load-force_load 링커 플래그를 사용해 보았습니다.

답변

1

all_load 및 force_load 링커 플래그는 코드가 이진 파일에 링크되어 있는지 확인합니다. 나는이 깃발들이 당신을 도울 것이라고 생각하지 않습니다.

믿을만한 보장은 myclass.cpp의 이니셜 라이저가 동일한 cpp 파일의 다른 코드가 호출되기 전에 호출된다는 것입니다. 함수를 통해 기본값에 대한 액세스 권한을 노출해야합니다. 이것은 싱글 톤 패턴과 유사합니다. 예 :

//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

통찰력을 주셔서 감사합니다. 불행히도, 오류는 새로운 버전의 라이브러리 바이너리를 다른 위치에 배치 한 라이브러리 빌드 시스템에 있었고, 나는 여전히 이전의 lib 바이너리를 사용하고있었습니다. 그것은 일어난다. .. – peetonn

관련 문제