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.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'
...

静的変数が 2 回初期化されたようです。1 つ目 – main.cpp の前、2 つ目 – 動的ライブラリのロード時。メインアプリと動的ライブラリの両方にリンクされた静的クラスを持つ静的ライブラリ。

PS私の質問には「静的」という言葉が多すぎます、私は知っています=)

4

1 に答える 1

0

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

DLL は、静的クラスをリンクする実行可能ファイルに対してリンクし、それを使用してヘルパー クラスを解決する必要があります。DLL をスタティック ライブラリにリンクするのではなく、実行可能ファイル自体にリンクします。

于 2012-05-12T07:33:29.857 に答える