Linuxのライブラリに関していくつかの議論に参加しており、いくつかのことを確認したいと思います。
アプリケーションを構築するときにライブラリを使用する方法は2つあるというのは私の理解です(間違っている場合は修正してください。後で投稿を編集します)。
- 静的ライブラリー(.aファイル):リンク時に、ライブラリー全体のコピーが最終アプリケーションに入れられるため、ライブラリー内の関数は常に呼び出し側アプリケーションで使用できます。
- 共有オブジェクト(.soファイル):リンク時に、オブジェクトは対応するヘッダー(.h)ファイルを介してAPIに対して検証されるだけです。ライブラリは、実行時まで実際には使用されません。
静的ライブラリの明らかな利点は、アプリケーション全体を自己完結できることです。動的ライブラリの利点は、「。so」ファイルを置き換えることができることです(つまり、セキュリティのために更新する必要がある場合)バグ)ベースアプリケーションを再コンパイルする必要はありません。
どちらも「.so」ファイルですが、共有オブジェクトとダイナミックリンクライブラリ(DLL)を区別する人がいると聞いています。Linuxまたは他のPOSIX準拠OS(つまり、MINIX、UNIX、QNXなど)でのC / C ++開発に関して、共有オブジェクトとDLLの間に違いはありますか?(これまでのところ)1つの重要な違いは、共有オブジェクトは実行時に使用されるだけであり、アプリケーション内でdlopen()呼び出しを使用してDLLを最初に開く必要があるということです。
最後に、一部の開発者が「共有アーカイブ」について言及しているのを聞いたことがあります。これは、私の理解では静的ライブラリでもありますが、アプリケーションで直接使用されることはありません。代わりに、他の静的ライブラリが「共有アーカイブ」にリンクして、共有アーカイブから構築中の静的ライブラリに一部(すべてではない)の関数/リソースをプルします。
よろしくお願いします。
更新
これらの用語が私に提供された状況では、Linuxを学習する必要があるWindows開発者のチームが使用した事実上誤った用語でした。私はそれらを修正しようとしましたが、(正しくない)言語の規範が行き詰まりました。
- 共有オブジェクト:プログラムの起動時にプログラムに自動的にリンクされ、スタンドアロンファイルとして存在するライブラリ。ライブラリはコンパイル時にリンクリストに含まれます(つまり
LDOPTS+=-lmylib
、という名前のライブラリファイルの場合mylib.so
)。ライブラリは、コンパイル時とアプリケーションの起動時に存在している必要があります。 - 静的ライブラリ:アプリケーションコードと、プログラムのビルド時にプログラムに自動的にリンクされるライブラリコード、および両方を含む最終バイナリを含む単一(大きい)アプリケーションのビルド時に実際のプログラム自体にマージされるライブラリメインプログラムとライブラリ自体は、単一のスタンドアロンバイナリファイルとして存在します。ライブラリは、コンパイル時にリンクリストに含まれます(つまり
LDOPTS+=-lmylib
、mylib.aという名前のライブラリファイルの場合)。ライブラリはコンパイル時に存在している必要があります。 - DLL:基本的に共有オブジェクトと同じですが、ライブラリはコンパイル時にリンクリストに含まれるのではなく、
dlopen()
/dlsym()
コマンドを介してロードされるため、プログラムをコンパイルするためにライブラリがビルド時に存在する必要はありません。また、ライブラリは、dlopen
/dlsym
呼び出しが行われたときにのみ必要になるため、アプリケーションの起動時またはコンパイル時に(必ずしも)存在する必要はありません。 - 共有アーカイブ:基本的に静的ライブラリと同じですが、「export-shared」フラグと「-fPIC」フラグを使用してコンパイルされます。ライブラリはコンパイル時にリンクリストに含まれます(つまり
LDOPTS+=-lmylibS
、という名前のライブラリファイルの場合mylibS.a
)。2つの違いは、共有オブジェクトまたはDLLが共有アーカイブを独自のコードに静的にリンクし、共有オブジェクトの関数を他のプログラムで使用するだけでなく、他のプログラムで使用できるようにする場合に、この追加のフラグが必要になることです。 DLLの内部。これは、誰かが静的ライブラリを提供し、それをSOとして再パッケージ化したい場合に役立ちます。ライブラリはコンパイル時に存在している必要があります。
追加アップデート
「DLL
」と「shared library
」の違いは、私が当時働いていた会社での(怠惰で不正確な)口語表現(Windows開発者はLinux開発に移行せざるを得ず、用語は行き詰まっている)であり、上記の説明に忠実でした。
さらに、S
「共有アーカイブ」の場合、ライブラリ名の後に続く「」リテラルは、その会社で使用されている規則であり、業界では一般的ではありませんでした。
.a
ファイル、「」実際に「archove」の略で、それは単にオブジェクトファイルのアーカイブです。最新のリンカは、whileライブラリを含める必要がなく、必要なアーカイブ内のオブジェクトファイルだけでなく、参照されるオブジェクトファイル内のコード/データのセクションを使用するだけで十分です。