Linux のライブラリ

1. 図書館とは何ですか?

ライブラリは、オペレーティング システムによってメモリにロードされて実行できる実行可能コードのバイナリ形式です。ソースコードを暗号化に相当するバイナリ形式のソースコードに変換することで、他人がライブラリを利用することはできますが、ライブラリ内の内容を見ることはできません。

2. ライブラリの分類とメリット・デメリット

静的ライブラリ: プログラムの実行前にターゲットプログラムに追加される
利点:
1. 静的ライブラリがアプリケーションにパッケージ化されているため、ロード速度が速い
2. プログラム公開時に静的ライブラリを用意する必要がない, すでにアプリに入っているので移植は簡単です。

欠点:
1. リンク中に実行可能ファイルに完全にコピーされるため、複数回使用すると冗長コピーが複数存在します。
2. 更新、展開、公開が面倒。

ダイナミック ライブラリ: ダイナミック関数ライブラリと共有関数ライブラリは同じものです (Linux では共有オブジェクト ライブラリと呼ばれ、ファイルの拡張子は .so、Windows ではダイナミック ローディング関数ライブラリと呼ばれ、ファイルの拡張子は .dll です) , プログラムの実行時に動的に (一時的に) ターゲット プログラムにロードされます。
利点:
1. リンク中にコピーがありません。プログラムの実行中、プログラムはプログラム呼び出しのためにシステムによってメモリに動的にロードされます。システムはそれをロードするだけです。一度実行すれば複数のプログラムで共有できるため、メモリを節約できます。
2. アプリ内にライブラリのソースコードがないため、プログラムのアップグレードが簡単で、アップグレード後も、ライブラリ名、関数名、パラメータが変更されず、実装が最適化されていれば、簡単にアップグレードできます。正常にロードできます。

欠点:
1. 読み込み速度が静的ライブラリよりも遅い
2. プログラムを公開するには、依存する動的ライブラリを提供する必要がある

3. ライブラリの作成と利用

1. スタティックライブラリの作成と利用
(1) 命名規則
スタティックライブラリのファイル名の命名方法は、ライブラリ名の前に「lib」を付け、サフィックスに「.a」を付け、「xxx」を付けた「libxxx.a」となります。は静的ライブラリ名です。

(2) 製作手順
原材料:ソースコード.c または .cpp

ステップ 1: .c ファイルを obj ファイルである .o に生成します。
gcc ac bc -c
ここに画像の説明を挿入します
は .o obj ファイルを生成します。

ステップ 2: .o
ar rcs 静的ライブラリ名をパックする 原材料
ar rcs libtest.a ao bo は
ここに画像の説明を挿入します
.a ライブラリ ファイルを生成します

(3) ライブラリを使用する
gcc test.c -I ./include -L./lib -lmycalc -o app

ここでは、同じディレクトリに複数のファイルを配置しているため、ヘッダー ファイルへのパスはなく、ヘッダー ファイルへのパスのみが存在します。ライブラリ、最後に -lpthread があるのは、プログラムが複数のスレッドを使用し、スレッド ライブラリを呼び出す必要があるためです。

-I (大文字の i): ヘッダー ファイルへのパス、つまり .h を指定します。デフォルトでは、/usr/include から検索します。

-L: ライブラリのパスを指定します。デフォルトでは、/usr/lib または /usr/local/lib から検索されます。

-l (小文字の L): ライブラリの名前を指定します (lib と .a を削除します)。

-o: 生成される最終アプリケーションの名前を指定します。デフォルトでは、Linux で生成される名前は a.out です。

2. 動的ライブラリの作成と利用
(1) 命名規則
ここに画像の説明を挿入します

動的ライブラリの命名方法は静的ライブラリと同様で、接頭辞は同じ「lib」、接尾辞は「.so」になります。つまり「libxxx.so」

(2) 作成手順ステップ 1: ソース ファイルを .o に生成します。パラメータ fpic gcc ac bc -c -fpic(fPIC)
を追加する必要があります

-fpic:fpic オプションはコンパイル段階で機能し、位置に依存しないコードを生成するためにターゲット ファイルを生成するときに使用する必要があります。

ここに画像の説明を挿入します
.o obj ファイルを生成する

ステップ 2: パッケージ化、gcc -shared ao bo -o libxxx.so
-shared: 動的ライブラリの生成を指定します
ここに画像の説明を挿入します

(3) ライブラリの使用
gcc main.c -I ./ -L ./ -l test -o app
ここに画像の説明を挿入します
ここでは、同じディレクトリに複数のファイルを配置しているため、ヘッダー ファイルへのパスはなく、ライブラリのみが存在します。パスの最後に -lpthread があるのは、プログラムがマルチスレッドを使用しており、スレッド ライブラリを呼び出す必要があるためです。

-I (大文字の i): ヘッダー ファイルへのパス、つまり .h を指定します。デフォルトでは、/usr/include から検索します。

-L: ライブラリのパスを指定します。デフォルトでは、/usr/lib または /usr/local/lib から検索されます。

-l (小文字の L): ライブラリの名前を指定します (lib と .a を削除します)。

-o: 生成される最終アプリケーションの名前を指定します。デフォルトでは、Linux で生成される名前は a.out です。

ただし、この時点では、「そのようなファイルまたはディレクトリはありません。環境変数を設定する必要があります。
ダイナミック ライブラリをロードできません。」というメッセージが表示されます。
ここに画像の説明を挿入します

環境変数
を使用して一時的に設定する: このようにして、プログラムを実行するためにターミナルを再度開いたときに、環境を再度追加する必要があります。ターミナルで:export LD_LIBRARY_PATH = "
ダイナミック
ライブラリへのパス"
ここに画像の説明を挿入します
またはシェル スクリプトを作成し、環境変数については、以下のようなプログラムを実行した後、
ここに画像の説明を挿入します
スクリプトを直接実行する場合、忘れずにスクリプトに実行権限を追加しておくと、毎回環境を追加し直す手間が省けます。

永続的な設定:
ユーザー レベル:
~/.bashrc、構成の完了後、ターミナルまたはソース ~/.bashrc を再起動します。
システム レベル:
/etc/profile、構成の完了後、コンピューターまたはソース /etc/profile を再起動します。

おすすめ

転載: blog.csdn.net/m0_68038554/article/details/131851681