2017-03-01 22 views
2

私は現在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.

+0

グローバル変数は、唯一それを含む翻訳単位内のエンティティの最初のODR-使用前に初期化されることが保証されています。 TUを使用しない場合は、グローバルを初期化することは保証されません。 –

+0

だから私は "適切に"彼らの初期化を強制的に回避策を見つける必要があります...良い。 – Zyend

+0

これの実際の使用例は何ですか?静的ライブラリへの単なるリンクには副作用がないという期待に沿ってかなりわかります。私が何かを使用しない場合、私はそれを支払う必要はありません、それはCとC++の背後にある設計原則です。 – zett42

答えて

7

あなたが実際に:: _インナー何とかまたはコードの一部が含まれませんAを使用する必要があります。どちらかを使用するか、そのファイル内の他のものを使用してください。リンカーは、観察可能な副作用があっても、決して使用されない翻訳単位でリンクする必要はありません。

How to force inclusion of "unused" object definitions in a library

+0

本当にあなたのニックネーを賞賛します!すべての私の尊敬。 –

+0

ありがとうございます。まあ...一見すると、その問題を解決するための「クリーン」なソリューションはありません。私は#pragmaステートメントのファンではないので、すべてのことをできるだけ汚いものにするでしょう... – Zyend

+0

私は基本的に "DECLARE_FILE(x)" "DEFINE_FILE(x)"をライブラリヘッダー/私のプログラムのメインでは "USE_FILE(x)"と表示されます。これらは、外部に割り当てられた静的intを作成し、メインに割り当てられます。これにより翻訳ユニットが組み込まれ、登録が行われました。とにかくそのようなものは、私が何をしたかを特に思い出さないでください。 –

関連する問題