Укажите порядок построения / уничтожения статических локальных объектов в разных аксессорах

я испытываю аварию вcxa_finalize запуск программы (это программа, а не библиотека внутри):

$ ./ac-test.exe 
Assertion failed: AcLock.cpp(54): AcLock
libc++abi.dylib: terminate called without an active exception
Abort trap: 6

Утверждение / сбой происходит из-за взаимодействия между объектом и регистратором. Регистратор уничтожается перед объектом, но объект использует регистратор. Таким образом, получаемый мьютекс, который выдает утверждение или сбой, уже был уничтожен (поэтому причинаpthread_mutex_lock не удается при блокировке регистратора) .I '

прочитал руководство по GCCУказание атрибутов переменных а такжеОбъявление атрибутов функций, но я'Я явно что-то упустил.

Я поместил объект и регистратор в общий заголовок в средствах доступа и попытался указать порядок построения:

// AcGlobals.h
static AcLogger& GetLogger() {

    static AcLogger logger __attribute__(init_priority(50));
    return logger;
}
static AcSocketList& GetAcceptSockets() {

    static AcSocketList sockets __attribute__(init_priority(100));
    return sockets;
}

Это привело к куче ошибок:

./AcGlobals.h:24:46: error: expected ';' at end of declaration
    static AcLogger logger __attribute__((init_priori...

./AcGlobals.h:24:47: warning: declaration does not declare anything
      [-Wmissing-declarations]
    static AcLogger logger __attribute__((init_priori...

Я также попытался поместить атрибут в функцию, а не в переменную:

// AcGlobals.h
static AcLogger& GetLogger() __attribute__(init_priority(50)) {

    static AcLogger logger;
    return logger;
}
static AcSocketList& GetAcceptSockets() __attribute__(init_priority(100)) {

    static AcSocketList sockets;
    return sockets;
}

Это привело к большему количеству проблем:

./AcGlobals.h:22:53: warning: GCC does not allow init_priority attribute in this
      position on a function definition [-Wgcc-compat]
static AcLogger& GetLogger() __attribute__((init_priority(50))) {
                                              ^
./AcGlobals.h:22:53: error: can only use 'init_priority' attribute on file-scope
      definitions of objects of class type

Я тоже пробовал__attribute__((constructor(50))) вместоinit_priority без радости

Заметка: ЯЯ работаю на машине Apple. У Apple естьособенность' где приоритет конструктора применяется только к украшенным функциям и переменным в одном и том же файле. Таким образом, они не могут быть распределены по единицам перевода.

Как именно указать порядок строительства и разрушения локальных статических объектов?

Ответы на вопрос(2)

Ваш ответ на вопрос