Linuxのライブラリとは何ですか?
なぜライブラリを使用するのですか?
静的および動的ライブラリを作成するにはどうすればよいですか?
どのように、なぜ我々はそれらを使用するのですか?
Linuxのライブラリ
ライブラリは、関数と呼ばれる事前にコンパイルされたコードの集合です。 ライブラリには共通の関数が含まれており、一緒に、それらは—a libraryと呼ばれるパッケージを形成します。 関数は、プログラム全体で再利用されるコードブロックです。 プログラムでコードを再度使用すると、時間が節約されます。 これは、プログラマがコードを数回書き換えないようにします。 プログラマにとって、ライブラリは再利用可能な関数、データ構造、クラスなどを提供します。
“たとえば、数学演算を実行する必要があるアプリケーションを構築している場合、そのために新しい数学関数を作成する必要はありません。”(“Linuxでの共有ライブラリの理解”)
ライブラリは実行可能ではなく、それはプロセスやアプリケーションとの主な違いです。 ライブラリは、実行時またはコンパイル時にその役割を果たします。 Cプログラミング言語では、動的ライブラリと静的ライブラリの二つのタイプのライブラリがあります。
ライブラリには、"-c" gcc flag
によって作成されたオブジェクトファイルがあり、慣例により".o"
で終わります。 これらはコンパイラの出力の結果であり、バイナリ形式の関数定義が含まれています。
動的ライブラリと静的ライブラリの違い
動的ライブラリまたは共有ライブラリは、実行可能ファイルの外部で別々のファイルとして発生します。 したがって、実行時にライブラリのファイルのコピーを1つだけ必要とします。 コンパイル時には、静的ライブラリはプログラムにロックされたままになります。 コンパイル時にライブラリのファイルのコピーを保持するファイルのプログラムが含まれています。
動的ライブラリを使用する場合、プログラマは実行時に必要なときにそのライブラリを参照しています。 たとえば、standard input/output header file
から文字列長関数にアクセスするには、動的にアクセスできます。 動的ローダーのため、実行時にプログラムのライブラリ参照を検索します。 次に、その文字列長関数をメモリにロードします。 したがって、動的ライブラリのアクセシビリティは容易に利用可能でなければなりません。
動的ライブラリの長所と短所
- 実行時にコピーが必要なのは1つだけです。 これは、アプリケーションとライブラリが互いに密接に利用可能であることに依存しています。
- 複数の実行中のアプリケーションは、各ファイルが独自のコピーを持つ必要なく、同じライブラリを使用します。
- ただし、動的ライブラリが破損した場合はどうなりますか? 実行可能ファイルは実行可能ファイルの外に存在し、破損に対して脆弱であるため、実行可能ファイルが動作しない可能性があります。
- 彼らは小さなファイルを保持しています。
- 動的ライブラリは実行時にリンクされます。 プログラマが変更を行ったときに再コンパイルと再リンクを必要としません。
コンパイル時には、アプリケーションは静的ライブラリを利用します。 関数のすべてのコピーは、プロセスを実行するために必要なため、アプリケーションファイルに配置されます。
静的ライブラリの長所と短所
- 静的ライブラリは実行可能ファイル内に存在するため、脆弱性に抵抗します。
- オブジェクトコード(バイナリ)が実行可能ファイル内にあるため、実行時の速度が速くなります。 したがって、関数への呼び出しはより速く実行されます。 動的ライブラリは実行可能ファイルの外部に存在するため、実行可能ファイルの外部から呼び出しが行われることに注意してください。
- ファイルとプログラムに加えられた変更には、再リンクと再コンパイルが必要です。
- ファイルサイズがはるかに大きいです。
静的および動的ライブラリを作成するにはどうすればよいですか?
両方のライブラリについて、プログラムにはライブラリに存在する各関数にprototype
を含める必要があります。 ヘッダーファイルを使用する場合は、header filename
を含めることを忘れないでください。
#include "<header file name>"
動的ライブラリ
動的ライブラリを作成するには、次のコマンドを記述します:
gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so
"*.c"
を使用すると、現在のディレクトリ内のすべてのCソースファイルを取得し、"liball.so."
という共有ライブラリを -fPIC
フラグを使用して、実行時に任意の仮想アドレ これは、位置独立コードの略です。ライブラリは、メモリ内の位置がプログラム間で変更されるため、固定アドレスでデータを保持しません。 オブジェクトファイルは-shared flag
を使用してコンパイルされます。 compiler
は、後で"lib"
で始まり、命名規則で終わるファイルを検索することによってライブラリを識別します, .so
プログラムは、ライブラリファイルを探すためにパスを必要とします。 そのため、次のコマンドを入力して、その場所を呼び出された環境変数に追加する必要がありますLD_LIBRARY_PATH.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
動的ライブラリを使用する場合は、次のコマンドを入力します:
gcc -g -wall -o app app.c liball.so
静的ライブラリ
静的ライブラリを作成するには、次のコマンドを使用する必要があります:
ar rc liball.a dog.o cat.o bird.o
"ar"
はarchive
を表し、静的ライブラリを作成するために使用されます。".o"
で終わるすべてのファイルはliball.a library
に追加され、この場合はオブジェクトファイルです。
-rc flag
は二つのことを行います:それがまだ存在しない場合は、新しいライブラリを置き換えて作成します。 次のステップは索引付けです。:
ranlib liball.a
静的ライブラリを使用する場合は、次のコマンドを入力します:
gcc main.c -L -l<filename>
-L flag
はlinker
にアクセスするので、ライブラリは指定されたディレクトリにあります。 また、コンパイラがシステムライブラリを探す他の場所も検索します。