Linuxでg ++で最適な静的リンク順序を決定するツールはありますか?私は、循環依存関係を解決するために、(必要に応じて)単一のライブラリまたは--start-groupと--end-groupへの繰り返し参照の使用を含む一般的な問題に精通していますが、大量の.aファイルをとり、必要に応じてライブラリを繰り返し、繰り返しを最小限に保ちながら、良い静的リンク順を吐き出すツールです。LinuxでStatic Link Orderツールを探しています
背景:私は、約800K行の継承されたC++コードを持つプロジェクトに取り組んでおり、より小さく、管理しやすいチャンクにリファクタリングしようとしています。既存のファイルのいくつかは巨大なモノリスです - 今日私は113のクラスと構造体を定義した単一の34K行の.hファイルを扱っています。多くのクラスは.hファイル内でほぼ完全にインラインに定義されていました。これを分割して、実装コードの一部を.cppファイルに移行すると、Linux上で必要なリンク順が変わり続けます。これはおそらく、.hファイルを含むすべてのライブラリが、それが必要とするクラスを独自に実装するために使用されたため、単一のライブラリファイル内の共通の実装にリンクする必要があるからです。長期的には、いくつかのクラスを別のライブラリに再編成し、いくつかの依存関係チェインを破ることになるでしょうが、現在のところ、依存関係はかなり絡み合っており、動作を変える可能性のあるコードへの摂動を最小限に抑えるよう努めています。私は手動で変更するたびに適切なリンク順を見つけ出す必要はありません。提案?
私はそのことを考えてきましたが、問題はそれよりも少しトリッキーです。トポロジカルな並べ替えは、あなたが含まれる前にあなたを呼び出すすべての人を待つ必要がある場合に機能します。しかし、ここでは必要ではありません。ライブラリAにシンボルbが必要な場合は、ライブラリBからシンボルbが必要な場合は、リンク順序でBの前にAがある場合はOKです(実際には必要かもしれません)誰にも必要な注文b。私はおそらく妥当なアルゴリズムを試してみることができますが、時間がかかります。また、実行する締め切りの作業もあります。だから私は既にそこにある戦闘テスト済みのソリューションを好むだろう。 – dewtell
@dewtell:このアプローチがうまくいかない場合もありますが、あなたのコードベースがそのうちの1つであることは確かですか? –
@Andrew - かなり確か。 .hファイルのインクルージョンに基づいて、lib1のfile1aがlib2のfile2aで定義されたシンボルを参照し、lib2のfile2bがlib1のfile1bで定義されたシンボルを参照するケースがたくさんあります。 – dewtell