Ich habe eine statische Bibliothek. Ich hatte durch die meisten Fragen auf Stack-Überlauf gegangen, aber konnte nicht kommen, zu einem richtigen AbschlussVerzögerung der Intailisierung der statischen globalen Variablen der gemeinsam genutzten Bibliothek
C++ static initialization order
Ich habe folgende Dateien
Datei ist 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();
};
Datei 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
}
Datei my_slib_new.h
#include <stdio.h>
class myFoo {
public:
myFoo() {
int *i = NULL;
i = new int ;
funS();
}
void funS();
};
Datei my_slib_new.cc
#include "my_slib_new.h"
static myFoo foo __attribute__ ((init_priority (2000)));
void myFoo::funS() {
int *i = new int;
}
Datei 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;
}
Ich habe folgende Schritte
Schritt 1: Zunächst erstellt die die statische Bibliothek von myNew.cc
1) g++ -g -c -fPIC myNew.cc
2) ar rcs libStaticNew.a myNew.o
Schritt 2: Erstellt gemeinsame Bibliothek von my_slib_new.cc
3) g++ -g -c -fPIC my_slib_new.cc
4) g++ -shared -o libSharedNew.so my_slib_new.o
Schritt 3:
5) gcc -Wall -o myTest sample_open_new.cpp -L . -lSharedNew -lStaticNew
Wenn ich laufen myTest ich Fehler erhalten folgende Behauptung
Assertion `MyNew :: val == true 'failed ist, weil das statische globale Objekt
statische myFoo foo Attribut ((init_priority (2000))); wird vor dem statischen globalen Objekt initialisiert
statisch myNew myNewObj Attribut ((init_priority (80)));
Meine Forderung ist ich nicht linStaticNew.a zu sharedLibrary .libStaticNew.a ändern kann als statisch bleibe nur
Ich habe versucht, das Laden der gemeinsam genutzten Bibliothek zu verzögern durch offenen Systemaufruf in sample_open_new.cpp verwenden, aber es hat nicht Arbeit.
Gibt es irgendeine Art und Weise wir das Laden der gemeinsam genutzten Bibliothek libSharedNew.so verzögern kann, ist die Idee, die statische globale Objekt statisch myNew myNewObj Attribut ((init_priority (80))); zuerst, bevor statische globale myFoo Objekt sollte
initialisiert werden, oder gibt es andere, die wir das statische globale Objekt von statischer Bibliothek libStaticNew.a sollten zunächst initialisiert werden
gibt es eine sauberere Möglichkeit, die shared library zur Laufzeit zu laden.Ich verknüpfe dies nicht mit der Anwendung, aber die gemeinsame Bibliothek zur Laufzeit laden – TechEnthusiast