2016-05-30 13 views
0

私たちは、これらのライブラリの他に依存し、その一部のコードは、いくつかのライブラリで構成されたアプリケーションを、持っているので、我々は円形リンクライブラリ

App 
| 
+--------+--------+ 
|  |  | 
v  v  v 
lib1  lib2  lib3 
|  | 
v  v 
lib3  lib3 

のような依存関係ツリーが最近誰かが新しいメソッドが追加されましたlib3は、lib2で定義されたクラスに依存し、循環インクルードを生成していたので、lib3にあるヘッダファイルに必要なクラスの前方宣言を行いました。

ここで、各ライブラリは静的ライブラリにコンパイルされ、それぞれのリンクリストとリンクされるため、lib2はlib2のリンクリストにあり、lib3はlib2の好きなリストにもあります。

これまで完全に動作していましたが、この種のコンパイルとリンクの依存関係に関連する欠点が不思議でした。私は、リコンパイルされていない限り、lib2の変更がlib3に気づかれないかもしれないと考えましたが、lib2のヘッダファイルの変更によってlib3の再コンパイルがトリガーされます。

私が知っておくべき他の重要な欠点はありますか?

+0

* "lib2のヘッダーファイルが変更された場合、lib3の再コンパイルがトリガーされます。" *なぜですか?それはビルドシステムであなたが課したものか、 '#include'文のパターンのせいで自然に発生したのでしょうか?後者の場合、 '#include'ステートメントが本当に必要であることは確かですか? – Beta

+0

私がこのケースで使用した1つの方法は、1つのライブラリ内に純粋仮想関数を持つ基本クラスを定義することです。他の図書館でそれから派生してください。次に、依存関係を減らします。多分他の方法があります。私はあなたが循環依存を避けるべきだと思います。 – user2672165

+0

循環依存関係では、常にすべてのライブラリにリンクする必要があります。次に、1つの大きな静的ライブラリファイルを作成することもできます。 – user2672165

答えて

2

私が知っておくべき他の重要な欠点はありますか?

実際には、リンク用に指定されたorder of librariesが実際に重要です。

これらの依存関係を解決するためにリンカーが使用する順序を取り除くには、通常、単一のプール.obj/.oのプールを使用しているように、それらをグループ化するオプションが用意されています。

GCCコンパイラの場合、これらのオプションは-Wl,--start-group,-Wl,--end-groupです。