質問

私は私が作った静的ライブラリを使っているアプリケーションを持っています。ライブラリ内の一つの.cppファイルは、そのctorのsomething-例えばないシングルトンで関数を呼び出す静的変数宣言を、持っています文字列を追加します。

私は、アプリケーションからそのライブラリを使用する場合、

さて、私のシングルトンが追加されることになっていた文字列の痕跡が含まれていないようです。

私は間違いなく何かが欠けているが、私は何を知らない..

役に立ちましたか?

解決

は、を明示的にのアプリケーションで使用されていない静的ライブラリ内のオブジェクトを持っている場合。その後、リンカは、アプリケーションへのlibからそのオブジェクトを引っ張らないでしょう。

静的および動的ライブラリの間には大きな違いがあります。

ダイナミックライブラリ:
コンパイル時には何もダイナミックライブラリから引き出されていません。余分なコードは、明示的にロードし、実行時にシンボルを解決するために追加されます。ライブラリ全体がロードされ、実行時に、したがって、オブジェクト初期化子が(実装の詳細があるときが)と呼ばれています。

静的ライブラリは非常に異なる方法で処理されます。
あなたは、静的ライブラリをリンクするときには、アプリケーションにライブラリで定義されているアプリケーションで定義されていないすべての項目を引っ張ります。ライブラリが解決することができ、それ以上の依存関係が存在しなくなるまでこれが繰り返されます。この副作用は、明示的に使用されていないオブジェクト/関数はライブラリ(したがって直接アクセスされていないグローバル変数は引っ張られない)形に引っ張られていないことである。

他のヒント

この私の記憶は少しかすんですが、初期化順序の問題で打たれる可能性があります。そこに呼び出される別のファイルに静的変数初期化子を注文する保証はありませんので、あなたのシングルトンがまだ初期化されていない場合、ライブラリ内の静的変数が初期化されているとき、それはあなたが見ている効果を生むかもしれません。

私はこれらの問題を回避得ている方法は、このようなものを行い、私はinitか何かの開始時に呼び出すことの明示的main機能のいくつかの並べ替えを持っていることです。それはまた、私のために働いていますので、あなたは(実際に、またはリンカー)を使用すると、コンパイラにオブジェクトファイルとライブラリの引数を与えた順番をいじることができるかもしれませんが、それは使用していないだけ依存しているため、そのソリューションは少し壊れやすいです特定のリンカおそらく、特定のバージョンます。

彼らは他のどのようなクラスに依存しないので、

静的な初期化を行うクラスをリファクタリング。つまり、各クラスの初期化の独立と自給自足作る、です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top