私は現在C++の厄介な問題に直面しています。*静的ライブラリでC++静的クラスメンバが初期化されていません*
実は、私も、私は私の現在の状況では、過去20年間:(
のためにそれに直面しなかった理由、我々は重く、C++実行ファイル(大抵のLinux組み込みシステムで)を使用して理解していない静的 。当社独自の静的LIBSにリンクされた我々は、技術と最適化の理由のために静的LIBSを使用するのです。
過去数年にわたり、確かに、私も共有ライブラリを作成するために使用される...
だから私は書き始めました静的なクラスメンバを持ついくつかのクラス。次のようになります。
class Inner
{
public:
Inner()
{
std::cout << "CTOR Inner" << std::endl;
}
};
class A
{
static Inner _inner;
...
};
// in the .cpp
Inner A::_inner;
///////////////////////
非常に基本的な使用例ですか?
私のユニットテストでは、libにリンクされているため、コンソールにstd::cout
というステートメントが表示されません。 私のクラスInnerとAを実行可能なソースコードに移動すると、うまくいきます。
私はそれが非常に基本的な問題だと確信しています。私は過去何年も直面したことはないと思います。 コンパイラに関連する問題ですか? WindowsとLinuxの両方のケースをテストしました(Debian、GCC 4.9)。
ご了承ください。
Z.
グローバル変数は、唯一それを含む翻訳単位内のエンティティの最初のODR-使用前に初期化されることが保証されています。 TUを使用しない場合は、グローバルを初期化することは保証されません。 –
だから私は "適切に"彼らの初期化を強制的に回避策を見つける必要があります...良い。 – Zyend
これの実際の使用例は何ですか?静的ライブラリへの単なるリンクには副作用がないという期待に沿ってかなりわかります。私が何かを使用しない場合、私はそれを支払う必要はありません、それはCとC++の背後にある設計原則です。 – zett42