2012-05-12 31 views
4

静的メンバーを持つ静的ライブラリがあります。このライブラリは、メインアプリケーションとそのプラグインの1つに静的にリンクしています。メイン(アプリケーション)とdll(プラグイン)の両方で初期化される静的変数のように見えます。静的ライブラリの静的メンバー

質問:動的ライブラリの読み込み時に静的変数の再初期化を回避する方法。それとも、私は何か簡単なものを見逃すかもしれない?

詳細情報:

orbhelper.h

class ORBHelper { 
    static std::string sss_; 
public: 
    static std::string getStr(); 
    static void setSTR(std::string str); 
}; 

orbhelper.cpp

これは静的メンバが含まれており、それはゲッターとセッターだ単純な静的ライブラリです

std::string ORBHelper::sss_ = "init"; 

static std::string ORBHelper::getStr() 
{ 
    std::cerr << "get " << sss_.c_str() << std::endl; 
    return sss_; 
} 
static void ORBHelper::setSTR(std::string str) 
{ 
    sss_ = str; 
    std::cerr << "set " << sss_.c_str() << std::endl; 
} 

このライブラリは、main.cppおよびmainにロードされている別のダイナミックライブラリでも使用されています。 main.cppでは静的な文字列を設定し、動的ライブラリ関数の1つでは、それを取得します。メインで静的変数を設定する

main.cppに

... 
ORBHelper::setStr("main"); 
std::cerr << ORBHelper::getStr().c_str() << std::endl; //prints 'main' 
//then loading library 
... 

は、その後のdllで変数の値を取得:

hwplugin.cpp

... 
std::cerr << ORBHelper::getStr().c_str() << std::endl; //prints 'init' instead of 'main' 
... 

は、静的なように見えます変数が初期化されたtwi ce。最初 - main.cppの前、動的ライブラリがロードされたときの秒。主アプリと動的libの両方にリンクされた静的なクラスを持つ静的なlib。

P.S.あまりにも多くの言葉 '静的'私の質問で、私は知っている=)

+0

静的にリンクすると、変数のインスタンスが2つ* exeに1つとDLLに1つ存在する可能性があります。 –

+0

変数(printf( "%p"、&sss);)のアドレスをチェックして、同じ変数であることがわかりました – uni

+2

私は最近同じ問題を抱えていました(http://stackoverflow.com/q/105205​​87/509868) ; 2つの使用可能な解決策があります(1:静的なlibを(秒)のDLLにするか、2:静的なlibの問題のあるものを初期化する既存のDLLに関数を追加する) – anatolyg

答えて

0

はい、ヘルパークラスの2つのインスタンスがあります。

DLLは、静的クラスをリンクする実行可能ファイルとリンクし、ヘルパークラスを解決するためにDLLを使用する必要があります。 DLLをスタティックライブラリにリンクせず、実行可能ファイル自体にリンクしてください。

+0

これを行うことはできません.dllをビルドするときにリンカーエラーが発生します。 –

+0

printf( "%p"、&sss_);をfuごとに追加しました。ヘルパーの任務と同じアドレスを印刷するたびに。それはヘルパーのインスタンスが1つしかないということではありませんか? – uni

+0

Hmm ...可能であれば、シンボルが同じメモリアドレスにマップされていても、2度実行されるのは静的初期化子です。 –

関連する問題