私は静的ライブラリを持っています。私は、スタックオーバーフローに関する質問のほとんどを通じて行っていたが、私は、ファイル共有ライブラリの静的グローバル変数のインテリゼーションを遅延する方法
ファイルが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++ static initialization order
に来ることができませんでした。 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 :: valを次取得== true 'staticグローバルオブジェクトのために失敗しました
static myFoo foo 属性((init_priority(2000)));静的グローバルオブジェクトの前に初期化される
静的myNew myNewObj 属性((init_priority(80))));
私の要件は唯一
は、私がsample_open_new.cppにオープンシステムコールを使用して共有ライブラリのロードを遅延しようとしたが、それはしなかった静的なままにすると、私はsharedLibrary .libStaticNew.aにlinStaticNew.aを変更することはできませんです作業。
は、我々が共有ライブラリlibSharedNew.soのロードを遅らせることができますどのような方法があるが、アイデアは、静的なグローバルオブジェクトの静的myNew myNewObj 属性((Init_priorityは(80)))です。静的なグローバルMYFOOオブジェクトの前に最初に初期化されなければならない
かは、私たちが静的ライブラリlibStaticNew.aの静的グローバルオブジェクトを指定することができますいずれかが最初
実行時に共有ライブラリを読み込む方法はありますか?これはアプリケーションにリンクしませんが、実行時に共有ライブラリをロードします – TechEnthusiast