2011-07-03 4 views
12

私は最近Ubuntuシステムでマイナーなプログラミングをしなければなりませんでした(私は非常に低レベルの初心者です)、私は実際にメイクファイルに精通しています。lib {library name} .a/.soはLinuxの静的ライブラリの命名規則ですか?

リンカーに含めるライブラリを指定する引数は、常に-l {library name}であり、対応するライブラリは/ usr/libフォルダ内の "lib {library name} .a"と呼ばれるものです。

私は疑問に思っています:それは大会ですか?私はlibNAME.aと呼ばれるライブラリを見つけるために-llibNAMEと入力する必要があると思っていたでしょうが、lib接頭辞を前提としています。

これはいつものケースですか? lib接頭辞を使用せずにライブラリに名前を付けることはできますか?

+2

答えはいいえです。静的ライブラリの命名規則は 'lib {name} .a'です。 –

+2

... '.so'ファイルは*共有*ライブラリです。 – BoltClock

+0

おっと、愚かな間違い!ありがとう! – 8bitcartridge

答えて

17

任意の方法で名前を付けることができますが、ld-lと仮定すると、lib接頭辞は静的ライブラリと共有ライブラリの両方に適用され、元に戻ります。接頭辞がlibでないものを使用するには、明示的に名前を付ける必要があります。

これは現代のシステムでも実際には役に立ちます。はランタイムプラグインを実装する共有オブジェクトを示していますが、libfoo.soという名前はリンク時ライブラリとして識別できます。特定のサブシステム用のプラグインを識別するために、libの代わりにサブシステム固有のプレフィックスを使用する。たとえばpam_*.soおよびnss_*.soを参照してください。

3

簡潔な答えですが、それは規約です。

g ++の-lオプションは、libとローカルパスのlib {somename} .soをチェックします。

しかし、UNIXでは、シンボリックリンクを使用することもできるため、makeスクリプトを変更することなく、異なるバージョンのライブラリを使用することができます。

を誰かが.soが共有ライブラリである一方で.aは、静的ライブラリの拡張である、コメントで指摘したように:追加する

編集。

3

実際には、です。つまり、ほぼ静的ライブラリと共有ライブラリを混在しています。静的ライブラリは.aファイルで、共有ライブラリの末尾は.soです。

要約すると、あなたは共有ライブラリについて話しています。共有ライブラリを使用してアプリケーションをリンクする際、あなたはNAMEが(それはオブジェクトのアーカイブだからa

11

name.aが静的​​ライブラリですlibNAME.so属する-lNAMEである標準的な慣習を、使用する必要があります。

name.soは、ダイナミック共有オブジェクト(DSOとも呼ばれる共有オブジェクトであるため、so)です。

リンカースイッチは、伝統的には形式がlibfoo.{so,a}で、ライブラリパス上で検索します。リンカーに直接ライブラリ名を渡すこともできます(-lスイッチを使用せずに)。その場合は、ライブラリへのパスを明示的に渡す必要があります。

@geekosaurと記載されています。実行時に共有オブジェクトを開くと、dlopen()は完全なファイル名をとります。