3

次の問題があります。私の(C ++-)プロジェクトはいくつかのサブプロジェクトで構成されています。それぞれに、起動時に実行したいコードを含むファイルがいくつかあります。これまでの私の解決策は、次のように初期化時にそれぞれのコードを呼び出す静的変数を使用することです。

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.

サブプロジェクトごとにdllを使用してプロジェクトをビルドすると、すべてが正常に機能し、コードは期待どおりに実行されます。ただし、サブプロジェクトを静的にリンクする場合、リンカーはFoo.oに外部から参照されたコードが含まれていないと判断し、最適化します。もちろん、別の場所にsFooRegistryへの参照を追加することもできますが、これは面倒でエラーが発生しやすくなります。

これを解決するための(標準準拠の)方法は何ですか?

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

4

2 に答える 2

4

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

また、リンカは起動コードを最適化していない-明らかに使用されていないため、リンカは単にリンクしていない。リンカーはかなりばかげた獣です。リンカーがどのように機能するかを知りたい場合は、リンカーとローダーの本をご覧ください。

于 2009-08-19T15:40:08.237 に答える
1

いくつかのトリックがありますが、それを確認してください。Winシステム(Linuxではない)の場合は、明示的なdllexportを使用します。この場合、リンカーは、このシンボルが外部アプリで使用されているかどうかを認識しません。

于 2009-08-19T15:44:45.997 に答える