2009-08-19 5 views
3

私は以下の問題があります。私の(C++ - )プロジェクトはいくつかのサブプロジェクトで構成されています。それぞれには、起動時に実行したいコードのファイルがいくつかあります。リンカーがスタートアップコードを最適化しないようにするには?

// Foo.cpp 

static TFooRegistry sFooRegistry; // does stuff in constructor. 

各サブプロジェクトのためのDLLを使用して私のプロジェクトをビルド、すべてが正常に動作し、期待通りのコードが実行されます。私のソリューションは、これまでのところ、このように初期化時にそれぞれのコードを呼び出す静的変数を使用することです。しかし、サブプロジェクトを静的にリンクするとき、リンカーは、Foo.oに外部から参照されたコードがないと判断し、最適化します。もちろん、sFooRegistryへの参照を他の場所に追加することもできますが、これは面倒でエラーが発生しやすいです。

これを解決するにはどのような(標準に準拠した)方法がありますか?

OK、mac/gccとwin/visual studioで何ができますか?

答えて

4

ライブラリにオブジェクトを強制的に初期化する標準的な方法はありません。特定のプラットフォームに応じてトリックを使用する必要があります。 DLLと静的ライブラリ(Windowsでは少なくとも)との違いは、 にはOSによって実行される起動とシャットダウンのコードが含まれていますが、後者はオブジェクトファイルの連結に過ぎません。

また、リンカは起動コードを最適化していません。リンクされていないのは明らかに使用されていないためです。リンカー はかなり馬鹿な獣です。あなたが何をするのかを知りたければ、 の本Linkers & Loadersを見てください。

+0

Doh!親愛なるBjarne:なぜですか? – Tobias

+0

リンカーがコードを最適化してリンクを張っていないのと違う点は何ですか?私はこれが同じことのちょうど2つの名前だと思った。 – Tobias

+0

C++は、コンストラクタの概念を持たない既存のリンカ(StroustrupのD&Eブックを参照)と連携するように設計されています。 –

1

いくつかのトリックですが、レビューしてください。 Windowsシステム(ただしLinuxではありません)では、明示的なdllexportを使用してください。この場合リンカーは、このシンボルが外部アプリケーションによって使用されているかどうかを知っていません。

関連する問題