私たちは、これらのライブラリの他に依存し、その一部のコードは、いくつかのライブラリで構成されたアプリケーションを、持っているので、我々は円形リンクライブラリ
App
|
+--------+--------+
| | |
v v v
lib1 lib2 lib3
| |
v v
lib3 lib3
のような依存関係ツリーが最近誰かが新しいメソッドが追加されましたlib3は、lib2で定義されたクラスに依存し、循環インクルードを生成していたので、lib3にあるヘッダファイルに必要なクラスの前方宣言を行いました。
ここで、各ライブラリは静的ライブラリにコンパイルされ、それぞれのリンクリストとリンクされるため、lib2はlib2のリンクリストにあり、lib3はlib2の好きなリストにもあります。
これまで完全に動作していましたが、この種のコンパイルとリンクの依存関係に関連する欠点が不思議でした。私は、リコンパイルされていない限り、lib2の変更がlib3に気づかれないかもしれないと考えましたが、lib2のヘッダファイルの変更によってlib3の再コンパイルがトリガーされます。
私が知っておくべき他の重要な欠点はありますか?
* "lib2のヘッダーファイルが変更された場合、lib3の再コンパイルがトリガーされます。" *なぜですか?それはビルドシステムであなたが課したものか、 '#include'文のパターンのせいで自然に発生したのでしょうか?後者の場合、 '#include'ステートメントが本当に必要であることは確かですか? – Beta
私がこのケースで使用した1つの方法は、1つのライブラリ内に純粋仮想関数を持つ基本クラスを定義することです。他の図書館でそれから派生してください。次に、依存関係を減らします。多分他の方法があります。私はあなたが循環依存を避けるべきだと思います。 – user2672165
循環依存関係では、常にすべてのライブラリにリンクする必要があります。次に、1つの大きな静的ライブラリファイルを作成することもできます。 – user2672165