0

私は静的ライブラリを持っています。私は、スタックオーバーフローに関する質問のほとんどを通じて行っていたが、私は、ファイル共有ライブラリの静的グローバル変数のインテリゼーションを遅延する方法

ファイルが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の静的グローバルオブジェクトを指定することができますいずれかが最初

答えて

0

短い答えを初期化する必要があります:いいえ、あなたがやろうとしているようではありませんそれ。

長時間の回答:はい、Static initialization order fiascoでお読みください。基本的にC++はに初期化順序についての保証はありませんです。最良のアドバイスは "異なるコンパイル単位でのグローバル統計の使用を避ける"です。ここで

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

オブジェクトが は、最初の使用上に構築されています。 here

+0

実行時に共有ライブラリを読み込む方法はありますか?これはアプリケーションにリンクしませんが、実行時に共有ライブラリをロードします – TechEnthusiast

0

使用シングルトンマイヤーズシングルトンはこのように、簡単である - しかし、他のオプションも同様に(上記のリンクFAQに言及があります。 。

+0

シングルトンは非常に大きな問題を引き起こし、使用をお勧めしません。彼らはあなたが悩んでいるお互いに応じて開始します彼らを正しい順序で破壊し、あなたが 'main'を離れると破壊されて以来、あなたは大部分の世界がその時に消えていることを確認しなければなりません。彼らは反パターンのIMOであり、理由がある。 –

+0

@JesperJuhl:そうです。あなたがそれを避けることができれば、新しいコードでそれらを使用しないでください。しかし、この文脈ではアドバイスは間違っています。これは、静的な初期化順序の失敗を抱えるシステムを修正することです。このタスクでは、シングルトンは「解決策」です。 [FAQ](https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use)でもありますが、よくある質問は便利なMeyersのこの回答のシングルトンを使用していません。 –

関連する問題