0

У меня есть статическая библиотека. Я прошел через большую часть вопросов на переполнение стека, но не смог прийти к правильному выводуКак задержать интеграцию статической глобальной переменной общей библиотеки

C++ static initialization order

Я следующие файлы

Файл является myNew.h

#include <cassert> 
#include <stdio.h> 
void* operator new(size_t sz); 

class myNew { 
    public: 
     myNew() { 
      initialize(); 
     } 
     static void* newPageCheck(); 
     static bool val; 

    private: 
     static void initialize(); 
}; 

Файл myNew. c

#include "myNew.h" 
static myNew myNewObj __attribute__ ((init_priority (80))); 
bool myNew::val = false; 

// overload default new operator 
extern void* operator new(size_t sz) { 
    return myNew::newPageCheck(); 
} 

void myNew::initialize() { 
    val = true; 
} 

void* myNew::newPageCheck() { 
    assert(val == true); 
    int i ; 
    return &i 
} 

Файл my_slib_new.h

#include <stdio.h> 

class myFoo { 
    public: 
     myFoo() { 
      int *i = NULL; 
      i = new int ; 
      funS(); 
     } 
     void funS(); 
}; 

my_slib_new.cc Файл

#include "my_slib_new.h" 
static myFoo foo __attribute__ ((init_priority (2000))); 

void myFoo::funS() { 
    int *i = new int; 
} 

sample_open_new.cpp Файл

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include "my_slib_new.h" 
int main() { 
    printf ("Your Program will run ... \n"); 
    int status = open("./libSharedNew.so",0); 
    return 0; 
} 

я следующие шаги

Шаг 1: Сначала создал статическую библиотеку из myNew.cc

1) g++ -g -c -fPIC myNew.cc 
2) ar rcs libStaticNew.a myNew.o 

Шаг 2: Создана общая библиотека из my_slib_new.cc

3) g++ -g -c -fPIC my_slib_new.cc 
4) g++ -shared -o libSharedNew.so my_slib_new.o 

Шаг 3:

5) gcc -Wall -o myTest sample_open_new.cpp -L . -lSharedNew -lStaticNew 

Когда я бегу MyTest я получаю следующее сообщение об ошибке утверждения

Утверждение `MyNew :: Вал == true 'не удалось, потому что статический глобальный объект

статический myFoo foo атрибут ((init_priority (2000))); инициализируется до статического глобального объекта

статический myNew myNewObj атрибут ((init_priority (80)));

Мое требование я не могу изменить linStaticNew.a к sharedLibrary .libStaticNew.a, чтобы оставаться статичным только

Я попытался задержать загрузку общей библиотеки, используя открытый системный вызов в sample_open_new.cpp, но он не сделал Работа.

Есть ли способ, мы можем задержать загрузку совместно используемые библиотек libSharedNew.so, идеи статического глобального объекта статического myNew myNewObj атрибута ((init_priority (80))); должен быть инициализирован первым перед объектом статического глобального MYFOO

или есть мы можем указать статический глобальный объект Static Library libStaticNew.a должен быть инициализирован первый

ответ

0

Короткий ответ: нет, не так, как вы пытаетесь сделать Это.

Более длинный ответ: да, вы должны прочитать на Static initialization order fiasco. В основном C++ дает никаких гарантий о порядке инициализации и наилучшем совете «избегать использования глобальной статики в разных единицах компиляции». Но есть и другие варианты, а также (упомянутые в FAQ связаны выше - here

+0

Есть ли какой-либо более чистый способ Я загружаю общую библиотеку во время выполнения. Я не привязываю ее к приложению, но загружает общую библиотеку во время выполнения. – TechEnthusiast

0

Используйте одиночек одноточечно Мейерс легко, как это:.

auto some_object() 
    -> Object& 
{ 
    static Object the_object; // Possibly constructor arguments here 
    return the_object; 
} 

Здесь объект построен на первом использовании.

+0

Синглтоны вызывают столько проблем, что я бы не рекомендовал их использовать. они начинаются в зависимости друг от друга. le уничтожая их в правильном порядке, и поскольку они уничтожены после того, как вы оставите «главную», вы должны убедиться, что они в порядке, когда большая часть мира ушла в то время. Просто скажите «нет». Это анти-шаблонная ИМО и по уважительным причинам. –

+0

@JesperJuhl: Правильно. Не используйте их в новом коде, если это можно избежать. Но в этом контексте совет неверен: речь идет об исправлении системы, которая страдает от фиаско порядка статического инициализации, и для этой задачи однополые решения являются «решением». Это даже [пункт часто задаваемых вопросов] (https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use), хотя в FAQ не используется удобный одноэлемент Мейерса этого ответа , –

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