web-dev-qa-db-ja.com

GCCを使用して静的ライブラリをリンクする適切な方法

一部の静的ライブラリ(lib * .a)は、共有ライブラリ(lib * .so)と同じようにリンクできる(ld -lスイッチ)が、そうでないものがあるのはなぜですか?

私は常に、静的かどうかに関係なく、すべてのライブラリーを-l ...でリンクできることを教えられていましたが、これまでのところ1つのライブラリー(GLFW)に遭遇しました。このようにリンクしてみてください。

この質問 の回答によると、静的ライブラリをリンクする「適切な」方法は、-lを使用するのではなく、独自のオブジェクトファイルとともにそれらを直接含めることです。そして、GLFWライブラリの場合、これは確かに問題を解決します。しかし、私が使用している他のすべての静的ライブラリは、-lとリンクすると問題なく機能します。

そう:

  • この1つのライブラリーを直接インクルードするのではなく、リンクすると何が機能しなくなるのですか?原因がわかっている場合は、ライブラリを編集および再コンパイルして問題を修正することができます。
  • 共有ライブラリをリンクするのと同じ方法で静的ライブラリをリンクすることを想定していないのは本当ですか? (そうでない場合、なぜそうではないのですか?)
  • この方法でライブラリが直接含まれている場合、リンカは未使用のライブラリ関数を出力実行可能ファイルから削除できますか?
22
Nairou

返信ありがとうございます!問題はリンクの順序が原因であることが判明しました。明らかに、他のライブラリの依存関係を持つライブラリを使用する場合、それらの他の依存関係をリストする必要がありますafter以前のライブラリではなく、ライブラリ。新しいことを学びました!

25
Nairou

静的ライブラリをリンクする正しい方法は-lを使用することですが、これは、ライブラリが検索パスにある場合にのみ機能します。そうでない場合は、-Lを使用してディレクトリをリストに追加するか、ファイルに名前を付けます。

共有ライブラリについても同じことが言えますが、実際には見つかりそうです。

6
ams

ライブラリのパスを(-Lを使用して)GCCに指示することを気にしましたか? -lのみを使用すると、GCCは標準ディレクトリで利用可能なライブラリのみをリンクできます。

-L[path] -l[lib]
5
Vincent L.

その理由は歴史的なものです。 「ar」ツールはPDP11 unixの元のファイルアーカイブツールでしたが、後でその目的のために「tar」で完全に置き換えられました。ファイル(この場合はオブジェクトファイル)をパッケージに格納します。また、リンカが使用するシンボルテーブルを含む個別の拡張機能があります。アーカイブ内のファイルを手動で管理している場合、シンボルテーブルが古くなる可能性があります。

簡単に言えば、アーカイブで「ranlib」ツールを使用してシンボルテーブルを再作成できるということです。やってみて。より広義には、破損したライブラリがどこから来ているのかを突き止め、それを修正してください。

1
Andy Ross