2012-02-21 3 views
26

コードベースが静的ライブラリに分割されています。残念ながら、ライブラリには循環依存があります。たとえばlibfoo.alibbar.aに依存し、その逆もあります。同じライブラリを2回リンクすることで循環依存関係を解決できますか?

私はこれを処理するための「正しい」方法はそうのように、リンカーの--start-group--end-groupオプションを使用することです知っている:

g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group 

しかし、当社の既存のMakefileには、問題は通常、次のように処理されます。

g++ -o myApp -lfoo -lbar -lfoo 

(これは〜に複雑な相互依存関係を持つ20個のライブラリを拡張想像してみてください。)

私はOUを通過されていますr第2フォームを最初に変更したメイクファイル、しかし今では私の同僚はなぜ私に尋ねています...そして、それは「クリーナーなので」と他のフォームが危険であるという曖昧な感覚の他に、良い答えはありません。

同じライブラリを複数回リンクすることができますこれまでに作成に問題がありますか?たとえば、同じ.oが2回引き込まれると、リンクが複数定義のシンボルで失敗する可能性がありますか?あるいは、同じ静的オブジェクトを2つコピーして微妙なバグを作成するリスクがありますか?

基本的に、同じライブラリを複数回リンクする際にリンク時または実行時にエラーが発生する可能性があるかどうかを知りたいと思います。もしそうなら、それらを引き起こす方法。ありがとう。

+0

私が考えることができる唯一の問題は、あなたが同じライブラリの2つの異なるバージョンとリンクすることを管理している場合です。それはやりにくく、Linuxでは(IMO)は起こりそうもない。また、20のライブラリのみがあまり見えません。それはmakefileを歩く価値があるのですか?あなたは何か他のことをする時間を費やすことができます。 – SigTerm

+3

この問題は、循環依存関係を持たないようにライブラリを修正すると消えてしまいます。 –

+3

ライブラリを調べて分割することによって循環依存関係を削除することはできませんか?それは最もクリーンな方法でしょう。 –

答えて

5

私が提供できるのは反例の欠如です。私は実際には(たとえそれがはっきりしていても)最初の形式を見たことはありませんでしたが、これは第2の形式で解決されています。

それでも、特定の方法で動作するリンカに頼るのではなく、ライブラリ間の関係をはっきりと示しているので、最初のフォームに変更することをお勧めします。

しかし、少なくとも共通の部分を追加のライブラリに引き出すコードをリファクタリングする可能性があるかどうかを検討することをお勧めします。

+5

私は私の質問のコメントの半分が「あなたのコードベースを修正!もう半分は「なぜあなたは作業用コードベースを改ざんしていますか?」と言っています。 :-) – Nemo

+0

最初の形式は、リンカーがリストされたすべてのライブラリにわたって繰り返されるシンボルを見つけようとするため、パフォーマンスコストを導入します。これを参照してください:http://stackoverflow.com/a/409470/70198 –

+0

最初の形式はGNU ldでのみ動作するため、移植可能な解決策ではありません。 – user1225999

1

これはレガシーアプリケーションなので、ライブラリの構造は、もはや関係しない配列から継承されていると思います。

継承されたライブラリ構造にまだ構造上の理由が残っていても、ほぼ確実に、従来の配置からもう1つのライブラリを構築することは可能です。 20ライブラリのすべてのモジュールを新しいライブラリliballofthem.aに入れるだけです。そして、すべての単一のアプリケーションは単純ですg++ -o myApp -lallofthem ...

関連する問題