0

私はここで少し深く、正直になるでしょう。TUがコンパイルに含まれる原因は何ですか?

奇妙な実験をしています。私のクラスを工場で匿名の名前空間を使って登録することが前提となっています。最近まで、以下をクラス定義(.cpp)に追加することはそのトリックを行うでしょう。

これはマクロでラップされ、 'Register'はそのタイプと名前を工場に渡します。

これは正常に動作し、静的ライブラリにコードを移動するまで、このマクロを含むすべてのクラスが登録されていました。今、クラスはファクトリによってのみ参照されるので、ビルドから省略されているように見えます。私の 'Register'関数はもはや呼び出されていないので、私のファクトリは空です。

私はすべてのマクロをマネージャオブジェクトのコンストラクタに移動することでこれを解決することができましたが、そこで参照するとすぐに.cppファイル内のマクロが呼び出されるようになったことに気付きました。私はクラスが実際に何かによって参照されているので、私は推測しました。

しかし、私はこのようにしたいとは思っていませんし、コンストラクタ内のクラスを参照する非コミット方法を見つけることができません(例えばclass ClassToRegister;)。私の登録マクロが呼び出されます。

まず、これは意味がありますか?

第2に、これらのTUを強制的にコンパイルして、実行時に匿名の名前空間を使用できるようにするためのアドバイスはありますか?

+1

(a)スタティックライブラリの構築方法を教えてください。 (この問題に対処する) – sehe

+1

TU:http://en.wikipedia.org/wiki/Translation_unit_(programming) - この例では、それは.hで表されるクラスです。 .cppファイル。 これはIOFの製品であると思われます。 – acron

答えて

1

静的ライブラリを使用しての一部と小包で表示されます。使用されていないコードはリンカーブードゥーなしではそれを通りません。

-1

あなたは積極的な最適化の犠牲者ですが、理由があります:名前のない名前空間でオブジェクトを使用しないため、コンパイラはそれらを削除します。

あなたは、このように周りを取得しようとすることができます:

namespace foo 
{ 
namespace{ 
MACRO_TO_DEFINE_VARIABLE(MyClass); // define a variable named registrationObj 
}; 

MyClass::MyClass() 
{ 
    (void)registrationObj; 
} 
} 
0

静的ライブラリはオブジェクトファイルの束で、リンカに「ねえ、私が他で定義していないものを見つける」と言っています。したがって、ライブラリ内の特定のオブジェクトファイルが依存関係を満たしていない場合、リンカの他の機能に依存せずにプログラムに含めることはできません(たとえば、一部のリンカはすべてのオブジェクトファイル依存関係を満たす人だけではなく静的ライブラリの代わりに)。

関連する問題