У меня есть статическая библиотека. Я прошел через большую часть вопросов на переполнение стека, но не смог прийти к правильному выводуКак задержать интеграцию статической глобальной переменной общей библиотеки
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 должен быть инициализирован первый
Есть ли какой-либо более чистый способ Я загружаю общую библиотеку во время выполнения. Я не привязываю ее к приложению, но загружает общую библиотеку во время выполнения. – TechEnthusiast