ライブラリ ファイルの検索には、次の 2 つの側面があります。
- プログラムをビルドするときは、依存ライブラリの場所とヘッダー ファイルを把握しておく必要があります。
- プログラムの実行中は、依存ライブラリの場所を知る必要がありますが、動的ライブラリの場合のみです。
プログラムの実行時に動的ライブラリのみがロードされ、ビルド時に静的ライブラリがプログラムにリンクされます。
ビルド中にライブラリを見つける
静的ライブラリの命名規則
lib + ライブラリ名 +.a
library name
静的ライブラリの実際の名前です。たとえばlibtest.a
、ライブラリ名ですtest
。
動的ライブラリの命名規則
lib + ライブラリ名 + .so + ライブラリのバージョン情報
動的ライブラリは、スタティック ライブラリに比べてライブラリのバージョン情報が多く、バージョン情報を指定すると、含まれるシンボルが異なるため、ライブラリ名は同じでバージョンが異なります。多くの場合、複数の異なるバージョンに依存するダイナミクスに遭遇します。バージョン番号は、これらのライブラリを区別するための重要な方法です。
ライブラリの実際の名前も同様ですlibrary name
。
構築時に依存する静的ライブラリ、動的ライブラリのいずれであっても、指定するライブラリのパスは一貫しており、構築プロセス中のライブラリ ファイルのパスは-L
andオプションで指定します。指定したライブラリのディレクトリであり、指定したライブラリ名はライブラリの実際の名前であり、対応するライブラリは-l
gcc main.o -L../lib -ltestlib -o test
-L
-l
-ltestlib
libtestlib.so或libtestlib.a
-L
ライブラリーを見つけるために使用するディレクトリーをコンパイラーに指示します。-l
For a dynamic library, the specified library name will be written into the final generated execution file. プログラムの実行中、ローダーは指定されたライブラリを検索しますが、ライブラリを見つけるための規則は同じではありません-L
。
-l
パス + ライブラリ名を続けることもできます, 例:
gcc main.o -l/home/test/lib/libtestlib.so -o test
しかし、この方法では、後ろのすべてのコンテンツが実行ファイルに書き込まれます. プログラムが実行されているとき, ローダーは-l
固定された場所に従って/home/test/lib/libtestlib.so
動的ライブラリをロードします. コンパイラ マシンが実行中のマシンと同じでない場合、ライブラリが見つからないため失敗します。
ランタイム動的ライブラリの場所の規則
次の優先順位の規則に従って:
LD_LIBRARY_PATH
ld.so.cache
- デフォルトのライブラリ パス (/lib/ や /usr/lib など)
動的ライブラリの場所と、より高い優先度の合計rpath
、runpath
これら 2 つの値は、動的ライブラリまたは実行プログラムの ELF ファイルに書き込まれます。ただし、これら 2 つの構成の意思決定プロセスはより複雑であり、gcc のバージョンが異なると処理方法が異なるという問題にも直面します。したがって、それらはここにリストされていません。普段使いLD_LIBRARY_PATH
にはldconfig
十分です。
LD_LIBRARY_PATH
環境変数の設定は、LD_LIBRARY_PATH
開発プロセスでよく使用する方法ですが、これは標準的な方法ではありません。通常、プログラムの正確性を一時的に検証するために、次のように環境変数を構成できます。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库目录
ld.so.cache
ld.so.cache
ライブラリ ディレクトリを検索するためのローダーの (ld.so
または) キャッシュ ファイルです。ld-linux.so
ツールで更新できますldconfig
。
標準的なコード展開プロセスはldconfig
ツール ベースであり、通常はパッケージ インストール プロセスの最後のステップであり、通常、ライブラリを含むディレクトリへのパスを入力パラメータとして渡し、それをファイルに書き込み、ローダーがすべての依存ライブラリを見つけることができますld.so.cache
。
ldconfig は、コマンド ラインで指定されたディレクトリ、ファイル/etc/ld.so.conf、および信頼できるディレクトリ ( /libおよび/usr/lib ) で見つかった最新の共有ライブラリへの必要なリンクとキャッシュを作成します。
ldconfig
指定されたディレクトリ 、/etc/ld.so.conf
システム ライブラリのデフォルト ディレクトリを検索します/lib
。リンカ (または) が依存ライブラリを見つけるために使用する/usr/lib
ライブラリのパス情報を it に書き込みます。/etc/ld.so.cach
ld.so
ld-linux.so
ldconfig
もう 1 つの重要な機能は、動的ライブラリのバージョンを更新することです。これについては、次のドキュメントで詳しく説明します。
したがって、独自の依存ライブラリを見つける必要がある場合は、ディレクトリを直接書き込むことができます/etc/ld.so.conf
が、/etc/ld.so.conf
通常は次のようになります。
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
**include ld.so.conf.d/*.conf**
ディレクトリ内のすべてのファイルが含まれていることを示すため**/etc/ld.so.conf.d/**
、通常、依存ライブラリ ディレクトリを含むこのディレクトリに conf ファイルを作成します。
#ls -lrt /etc/ld.so.conf.d/
-rw-r--r-- 1 root root 19 8月 9 2019 dyninst-x86_64.conf
-rw-r--r-- 1 root root 17 4月 3 2020 mariadb-x86_64.conf
-rw-r--r-- 1 root root 26 6月 1 2020 bind-export-x86_64.conf
-r--r--r-- 1 root root 63 8月 26 2020 kernel-3.10.0-1127.19.1.el7.x86_64.conf
#ldconfig
その後、ldconfig
ディレクトリを/etc/ld.so.cach
ファイルに更新させることで、ldconfig -p
キャッシュにキャッシュされた動的ライブラリとそのパス情報が書き込まれているかどうかを確認できます ( ldconfig -p | grep 依赖的动态库
)。