1. 概要

3つの異なるプログラムを設計およびコーディングしたいプログラマーを想像してみてください。 彼は、3つのプログラムが、プログラムで再利用できるいくつかの共通の機能を共有していると考えています。 彼の生活を楽にするために、彼はそれらの機能をライブラリと呼ばれる単一のエンティティに集める必要があります。

一般に、ライブラリは、他のプログラマーやプログラムが再利用できるように作成されたデータと関数のコレクションです。 Linuxでは、アーカイブライブラリは.a拡張子で終わり、共有オブジェクトライブラリは.so拡張子で終わります。

この記事では、Linuxでプログラムがどのように実行されるか、およびアーカイブと共有オブジェクトライブラリによって提供される目的について説明します。 それとは別に、プログラム用のライブラリを構築する方法の例もいくつか見ていきます。 GNUCコンパイラGNUarユーティリティを使用します。

2. Linuxでのプログラムの実行方法

ほとんどのLinuxユーザーは、おそらく /libおよび/usr /libディレクトリに出くわしたことがあります。 これらは、Linuxマシンにインストールされているプログラムによって使用されるすべての共通関数を格納するディレクトリです。 慣例として、ライブラリ名は「lib」で始まり、拡張子によってライブラリのタイプが決まります。

  • .a —「アーカイブ」の略
  • .so —「共有オブジェクト」の略

プログラムは、複数の共有オブジェクトに依存している場合があります。 そのため、共有オブジェクトを手動でインストールするのは面倒な場合があります。 これを支援するには、実際のプログラムをインストールする前に依存関係を計算して決定するツールであるパッケージマネージャーが必要です。

プログラムを実行すると、 / usr /libおよび/shareディレクトリで必要な依存関係が検索されます。 ただし、必要な依存関係がない場合、プログラムは起動に失敗します

3. プログラムライブラリ

プログラムライブラリは、一般的なタスクを実行するために必要な関連データとサブルーチンで構成されています。 たとえば、複数のプログラムが結果を計算するために複素数を使用する必要がある場合があります。 この機能を提供するライブラリの良い例は、 GNU Cライブラリです。これは、リンク段階でgccコンパイラによってプログラムにリンクされます。

3.1. 静的ライブラリ

従来の静的ライブラリは、コンパイル時にプログラムにリンクされるタイプのライブラリです。 したがって、ライブラリのオブジェクトコードは、プログラム実行可能ファイルのオブジェクトコードに含まれています。 最終的に、静的ライブラリにリンクされた複数のプログラムがある場合、結果の各プログラムバイナリには、参照されたライブラリのオブジェクトコードが含まれます。 その結果、これはより大きな実行可能ファイルにつながります。

静的ライブラリは通常、 .a 拡張子で終わります—たとえば、glibc.a

3.2. 共有ライブラリ

より大きな実行可能バイナリの問題に対処するために、プログラマーは代わりに共有ライブラリを使用します。 共有ライブラリはダイナミックライブラリとも呼ばれます。 これらの共有ライブラリは、オペレーティングシステムで使用可能なダイナミックリンカーによって実行時にリンクされます。

共有ライブラリは通常、 .so 拡張子で終わります—例はlibboost.5.6.soです。 静的ライブラリとは異なり、共有ライブラリを参照するプログラムは、結果の実行可能ファイルに共有ライブラリオブジェクトコードを含めません。 したがって、より小さな実行可能ファイルが得られます。

同様に、同じ共有ライブラリを参照する複数のプログラムがある場合、ライブラリには、プログラムが同時に再利用できる単一のコピーがあります。 これはオペレーティングシステムによって安全に管理されており、最新のコンピューティングの基盤となっています。 / usr / lib /xorgディレクトリを見てみましょう。

$ ls -halF /usr/bin/xorg
-rwxr-xr-x 1 root root  95K Apr 13 20:12 libexa.so*
-rwxr-xr-x 1 root root  23K Apr 13 20:12 libfbdevhw.so*
-rwxr-xr-x 1 root root 111K Apr 13 20:12 libfb.so*
-rwxr-xr-x 1 root root 213K Apr 13 20:12 libglamoregl.so*
-rwxr-xr-x 1 root root 143K Apr 13 20:12 libint10.so*
-rwxr-xr-x 1 root root  15K Apr 13 20:12 libshadowfb.so*
-rwxr-xr-x 1 root root  39K Apr 13 20:12 libshadow.so*

ご覧のとおり、Xorgはリストされている共有ライブラリによって異なります。 これらのライブラリは、dwmなどの他のプログラムでも使用できます。

4. .aまたは静的ライブラリの構築

この図を機能させるには、ソースコードをコンパイルするためにgccが必要です。 C プログラミングソースファイルがたくさんあると仮定します—ソースファイルをオブジェクトコードにコンパイルする必要があります。 これは、-Wallオプションを指定してgccコマンドを発行することで実現できます。

$ gcc -Wall -c *.c

ソースディレクトリのルートにいることを確認する必要があります。 -Wall オプションは、発生したすべての警告を出力するようにコンパイラーに指示します。 *。c引数のアスタリスクは、すべての*。cソースファイルをコンパイルするようにコンパイラーに指示します。 上記のコマンドを発行すると、コンパイラは*.cファイルを対応するオブジェクトファイルにコンパイルします。 したがって、ライブラリを構築するために必要なすべての必要な*。oファイルを取得します。

次に、 GNUBinutilsに含まれているarユーティリティを使用して、オブジェクトコードからライブラリファイルを作成します。

$ ar -cvq libfile.a *.o

-c オプションはエラーを抑制し、 -v オプションは詳細出力用に提供され、-qオプションは指定されたファイルを記録。 アーカイブが存在しない場合は、代わりに新しいアーカイブが作成されます。 ar コマンドが正常に実行されると、静的ライブラリファイルlibfile.aを取得する必要があります。 libfile.aファイルに何が含まれているのか見てみましょう。

$ ar -t libfile.a

これにより、libfile.aにアーカイブされているすべてのオブジェクトファイルが一覧表示されます。 後で、プログラムにライブラリを含めたい場合、コンパイルでライブラリを参照するだけですコマンド

$ gcc -o MyProgram *.o -L path/to/libdir -lfile.a

-L オプションは、ライブラリディレクトリを指定するために使用されます。 コマンドのライブラリファイル名に注意してください。 libプレフィックスを-lに置き換えました。 MyProgram 実行可能ファイルには、libfile.aライブラリのオブジェクトコードが含まれます。

5. .soまたは共有ライブラリの構築

共有ライブラリは、gccを使用して簡単に構築できます。 以前と同様に、最初にソースファイルを対応するオブジェクトファイルにコンパイルする必要があります。

$ gcc -Wall -c *.c

コードがコンパイルされたら、オブジェクトコードファイルを次のコマンドにフィードして、共有ライブラリを作成する必要があります。

$ gcc -shared -o libfile.so *.o

-shared オプションは、共有ライブラリを構築していることをコンパイラに指定します。 コンパイルが成功すると、実行時にすべてのプログラムで使用できるようにシステムにインストールできる共有ライブラリが構築されます。

6. 結論

このチュートリアルでは、ほとんどのプログラムがLinuxマシンでどのように実行され、プログラムがライブラリにどのように依存しているかを確認しました。 次に、静的ライブラリと共有ライブラリ、およびそれらが提供する目的について説明しました。 最後に、 gccコンパイラとそのヘルパーユーティリティar。を使用して、独自のプログラム用の静的ライブラリと共有ライブラリを構築する方法の例を確認しました。

1. 概要

3つの異なるプログラムを設計およびコーディングしたいプログラマーを想像してみてください。 彼は、3つのプログラムが、プログラムで再利用できるいくつかの共通の機能を共有していると考えています。 彼の生活を楽にするために、彼はそれらの機能をライブラリと呼ばれる単一のエンティティに集める必要があります。

一般に、ライブラリは、他のプログラマーやプログラムが再利用できるように作成されたデータと関数のコレクションです。 Linuxでは、アーカイブライブラリは.a拡張子で終わり、共有オブジェクトライブラリは.so拡張子で終わります。

この記事では、Linuxでプログラムがどのように実行されるか、およびアーカイブと共有オブジェクトライブラリによって提供される目的について説明します。 それとは別に、プログラム用のライブラリを構築する方法の例もいくつか見ていきます。 GNUCコンパイラGNUarユーティリティを使用します。

2. Linuxでのプログラムの実行方法

ほとんどのLinuxユーザーは、おそらく /libおよび/usr /libディレクトリに出くわしたことがあります。 これらは、Linuxマシンにインストールされているプログラムによって使用されるすべての共通関数を格納するディレクトリです。 慣例として、ライブラリ名は「lib」で始まり、拡張子によってライブラリのタイプが決まります。

  • .a —「アーカイブ」の略
  • .so —「共有オブジェクト」の略

プログラムは、複数の共有オブジェクトに依存している場合があります。 そのため、共有オブジェクトを手動でインストールするのは面倒な場合があります。 これを支援するには、実際のプログラムをインストールする前に依存関係を計算して決定するツールであるパッケージマネージャーが必要です。

プログラムを実行すると、 / usr /libおよび/shareディレクトリで必要な依存関係が検索されます。 ただし、必要な依存関係がない場合、プログラムは起動に失敗します

3. プログラムライブラリ

プログラムライブラリは、一般的なタスクを実行するために必要な関連データとサブルーチンで構成されています。 たとえば、複数のプログラムが結果を計算するために複素数を使用する必要がある場合があります。 この機能を提供するライブラリの良い例は、 GNU Cライブラリです。これは、リンク段階でgccコンパイラによってプログラムにリンクされます。

3.1. 静的ライブラリ

従来の静的ライブラリは、コンパイル時にプログラムにリンクされるタイプのライブラリです。 したがって、ライブラリのオブジェクトコードは、プログラム実行可能ファイルのオブジェクトコードに含まれています。 最終的に、静的ライブラリにリンクされた複数のプログラムがある場合、結果の各プログラムバイナリには、参照されたライブラリのオブジェクトコードが含まれます。 その結果、これはより大きな実行可能ファイルにつながります。

静的ライブラリは通常、 .a 拡張子で終わります—たとえば、glibc.a

3.2. 共有ライブラリ

より大きな実行可能バイナリの問題に対処するために、プログラマーは代わりに共有ライブラリを使用します。 共有ライブラリはダイナミックライブラリとも呼ばれます。 これらの共有ライブラリは、オペレーティングシステムで使用可能なダイナミックリンカーによって実行時にリンクされます。

共有ライブラリは通常、 .so 拡張子で終わります—例はlibboost.5.6.soです。 静的ライブラリとは異なり、共有ライブラリを参照するプログラムは、結果の実行可能ファイルに共有ライブラリオブジェクトコードを含めません。 したがって、より小さな実行可能ファイルが得られます。

同様に、同じ共有ライブラリを参照する複数のプログラムがある場合、ライブラリには、プログラムが同時に再利用できる単一のコピーがあります。 これはオペレーティングシステムによって安全に管理されており、最新のコンピューティングの基盤となっています。 / usr / lib /xorgディレクトリを見てみましょう。

$ ls -halF /usr/bin/xorg
-rwxr-xr-x 1 root root  95K Apr 13 20:12 libexa.so*
-rwxr-xr-x 1 root root  23K Apr 13 20:12 libfbdevhw.so*
-rwxr-xr-x 1 root root 111K Apr 13 20:12 libfb.so*
-rwxr-xr-x 1 root root 213K Apr 13 20:12 libglamoregl.so*
-rwxr-xr-x 1 root root 143K Apr 13 20:12 libint10.so*
-rwxr-xr-x 1 root root  15K Apr 13 20:12 libshadowfb.so*
-rwxr-xr-x 1 root root  39K Apr 13 20:12 libshadow.so*

ご覧のとおり、Xorgはリストされている共有ライブラリによって異なります。 これらのライブラリは、dwmなどの他のプログラムでも使用できます。

4. .aまたは静的ライブラリの構築

この図を機能させるには、ソースコードをコンパイルするためにgccが必要です。 C プログラミングソースファイルがたくさんあると仮定します—ソースファイルをオブジェクトコードにコンパイルする必要があります。 これは、-Wallオプションを指定してgccコマンドを発行することで実現できます。

$ gcc -Wall -c *.c

ソースディレクトリのルートにいることを確認する必要があります。 -Wall オプションは、発生したすべての警告を出力するようにコンパイラーに指示します。 *。c引数のアスタリスクは、すべての*。cソースファイルをコンパイルするようにコンパイラーに指示します。 上記のコマンドを発行すると、コンパイラは*.cファイルを対応するオブジェクトファイルにコンパイルします。 したがって、ライブラリを構築するために必要なすべての必要な*。oファイルを取得します。

次に、 GNUBinutilsに含まれているarユーティリティを使用して、オブジェクトコードからライブラリファイルを作成します。

$ ar -cvq libfile.a *.o

-c オプションはエラーを抑制し、 -v オプションは詳細出力用に提供され、-qオプションは指定されたファイルを記録。 アーカイブが存在しない場合は、代わりに新しいアーカイブが作成されます。 ar コマンドが正常に実行されると、静的ライブラリファイルlibfile.aを取得する必要があります。 libfile.aファイルに何が含まれているのか見てみましょう。

$ ar -t libfile.a

これにより、libfile.aにアーカイブされているすべてのオブジェクトファイルが一覧表示されます。 後で、プログラムにライブラリを含めたい場合、コンパイルでライブラリを参照するだけですコマンド

$ gcc -o MyProgram *.o -L path/to/libdir -lfile.a

-L オプションは、ライブラリディレクトリを指定するために使用されます。 コマンドのライブラリファイル名に注意してください。 libプレフィックスを-lに置き換えました。 MyProgram 実行可能ファイルには、libfile.aライブラリのオブジェクトコードが含まれます。

5. .soまたは共有ライブラリの構築

共有ライブラリは、gccを使用して簡単に構築できます。 以前と同様に、最初にソースファイルを対応するオブジェクトファイルにコンパイルする必要があります。

$ gcc -Wall -c *.c

コードがコンパイルされたら、オブジェクトコードファイルを次のコマンドにフィードして、共有ライブラリを作成する必要があります。

$ gcc -shared -o libfile.so *.o

-shared オプションは、共有ライブラリを構築していることをコンパイラに指定します。 コンパイルが成功すると、実行時にすべてのプログラムで使用できるようにシステムにインストールできる共有ライブラリが構築されます。

6. 結論

このチュートリアルでは、ほとんどのプログラムがLinuxマシンでどのように実行され、プログラムがライブラリにどのように依存しているかを確認しました。 次に、静的ライブラリと共有ライブラリ、およびそれらが提供する目的について説明しました。 最後に、 gccコンパイラとそのヘルパーユーティリティar。を使用して、独自のプログラム用の静的ライブラリと共有ライブラリを構築する方法の例を確認しました。