2011-01-09 3 views
1

私はリンカからいくつかのライブラリを除外でき、まだビルドできるプロジェクトがありますか?リンカの不要なリンクライブラリ

最終製品の性能とメモリの観点から除外する方が良いですか?チャンスは唯一、実際に終わるだろうヘッダとライブラリ起動コードがロードされており、これらはページアウトすることができます - より高速なビットを起動させるとメモリの小さな量を節約するかもしれない最終的な実行可能ファイルからいくつかの未使用のライブラリを除く

答えて

2

起動後に

ただし、手動では行わないでください。ライブラリを追加するように指示されたのであれば、おそらく理由があるかもしれません。おそらくを使用していない関数呼び出しがありますが、が必要ですが、後でその関数呼び出しを使用すると忘れているかもしれません。

ほとんどのリンカーには、使用されていないライブラリを自動的に除外するオプションがあります。そのため、そのオプションを有効にしておくと便利です。

注:ごくまれに、ライブラリの起動コードに重要な影響があります。その場合、除外しないでください。これは、図書館の文書をチェックすることによって最もよく決まるものです。このようなことは(うまくいけば!)はっきりと文書化されるべきです。

4

良いC++リンカは、コードで使用されていないライブラリからの呼び出しを含まない(いわゆるデッドコードストリッピング→)。

だから、最終リリースをリリースするためにどのようなC++リンカを使用しているかによって異なります。おそらく、デッドコード・ストリッピングに関する情報を得るためにリンカーのドキュメントを参照するべきでしょう。それをしていない場合は、プログラムの最終的なメモリフットプリントを減らすのに間違いなく役立ちます。

乾杯し、その情報が役立つことを願っています!

-1

はい、不要なライブラリを除外する方が常に優れています。

1

違いはありません。

任意の価値の任意のリンカーは、これらのライブラリは、コマンドラインで指定されている場合でも、アプリケーションによって(直接的または間接的に)参照されていないライブラリからは何も含まれません。
ライブラリを(一部に)含める理由は次のとおりです。 - アプリケーションがライブラリの関数またはグローバルオブジェクトを使用しています - 一部の参照を解決するために含まれていたライブラリの一部が、このライブラリのグローバルオブジェクトです。

リンカはやみくもアプリケーションで一緒にあなたが提供するすべてのものを入れていませんが、それは、オブジェクト(アプリケーションの)ファイルとライブラリを区別します。
リンカは、最初にすべてのオブジェクトファイルを収集し、ファイル間で作成された参照を解決します。その後
は、リンカは、指定されたライブラリを通過し、各ライブラリーから(既知の)未解決の参照を解決するために必要なこれらの部分を取ります。これにより、ライブラリ間の依存関係により未解決の参照が新たに作成される可能性があります。ほとんどのリンカーはライブラリを1回だけ通過しますが、いくつかは複数のパスを実行してすべての参照を解決することがあります。 参照を解決する必要のないライブラリの部分は、実行可能ファイルに含まれていません。

+1

これは誤解を招くだけでなく、間違ったクロスコンパイルのためのGNUツールチェーンに関する私の経験によると思います。 – Tod