CアプリケーションでGSLライブラリのいくつかの関数を使用しています。このライブラリは非常に大きく、機能や機能がたくさんあるので、そのうちのいくつかだけが必要です。私の問題は、小さな組み込みシステムでアプリケーションを使用したいのですが、この大きなライブラリを使用すると、コンパイルされたアプリケーションが非常に大きくなることです。
そのような大きなライブラリから関数とファイルの特定のサブセットを抽出する機能はありますか?
よろしくお願いします、
そのような大規模なライブラリから関数とファイルの特定のサブセットを抽出する機能はありますか?
はい - それはリンカがすでに行っていることです。
ライブラリは、個々のオブジェクト コード ファイルのコレクションです。リンカーは、実際にコード内の参照を解決するために必要なオブジェクト ファイルのみをリンクします。ライブラリ設計者がライブラリを十分に細分化した(理想的には、オブジェクト ファイルごとに 1 つのパブリック関数) 限り、リンクされたアプリケーション コードはライブラリのサイズにまったく関係せず、明示的に参照したコードの合計のみになります。
したがって、私のアドバイスは、最初にコードを作成してから、実際に問題があるかどうかを確認することです。問題がない可能性があります。あなたのアプリケーションはおそらく既に標準 C ライブラリにリンクしていることに注意してください。それ自体では、アプリケーションがライブラリ全体のサイズになるわけではありません!
リンカは、リンクされているオブジェクト コードとその中の関数およびデータ オブジェクトを正確に詳述する MAP ファイルを出力できます。リンクがどれほど効率的であるかを判断できます。ただし、呼び出す関数は、自分自身を明示的に参照していないライブラリ内の他の関数を呼び出す可能性が高いことに注意してください。リンカーは、そのような依存関係の詳細を示す相互参照テーブルを出力できる場合もあります。
実際に mklibs を使用できます: https://launchpad.net/mklibs
そのライブラリに応じた一連の実行可能ファイルに基づいて、共有ライブラリの未使用部分を取り除くことができます。
ライブラリのコードを持っている必要さえありません。
GLSライブラリを変更できれば、スリムバージョンの作成を試みることができます。
最良の方法は、のようなツールを使用して発信者/着信者のグラフを生成doxygen
し、使用されて必要なものだけを選択することです。おそらく、いくつかの依存関係(たとえば、ロギング、状態の管理、不要なオプション)を無視することもできます。
ただし、このアプローチにはかなりの作業が必要になります。ただし、小さな組み込みシステムを使用している場合は、「スリムバージョン」のコード行数がそれほど多くない可能性があるため、チェリーピッキングが妥当な場合があります。