C/C++プログラムのコンパイルとリンク (5) ライブラリファイルの配置


ライブラリ ファイルの検索には、次の 2 つの側面があります。

  • プログラムをビルドするときは、依存ライブラリの場所とヘッダー ファイルを把握しておく必要があります。
  • プログラムの実行中は、依存ライブラリの場所を知る必要がありますが、動的ライブラリの場合のみです。

プログラムの実行時に動的ライブラリのみがロードされ、ビルド時に静的ライブラリがプログラムにリンクされます。

ビルド中にライブラリを見つける

静的ライブラリの命名規則

lib + ライブラリ名 +.a

library name静的ライブラリの実際の名前です。たとえばlibtest.a、ライブラリ名ですtest

動的ライブラリの命名規則

lib + ライブラリ名 + .so + ライブラリのバージョン情報

動的ライブラリは、スタティック ライブラリに比べてライブラリのバージョン情報が多く、バージョン情報を指定すると、含まれるシンボルが異なるため、ライブラリ名は同じでバージョンが異なります。多くの場合、複数の異なるバージョンに依存するダイナミクスに遭遇します。バージョン番号は、これらのライブラリを区別するための重要な方法です。
ライブラリの実際の名前も同様ですlibrary name
構築時に依存する静的ライブラリ、動的ライブラリのいずれであっても、指定するライブラリのパスは一貫しており、構築プロセス中のライブラリ ファイルのパスは-Landオプションで指定します。指定したライブラリのディレクトリであり、指定したライブラリ名はライブラリの実際の名前であり、対応するライブラリは-l
gcc main.o -L../lib -ltestlib -o test
-L-l-ltestliblibtestlib.so或libtestlib.a

  • -Lライブラリーを見つけるために使用するディレクトリーをコンパイラーに指示します。
  • -lFor 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動的ライブラリをロードします. コンパイラ マシンが実行中のマシンと同じでない場合、ライブラリが見つからないため失敗します。

ランタイム動的ライブラリの場所の規則

次の優先順位の規則に従って:

  1. LD_LIBRARY_PATH
  2. ld.so.cache
  3. デフォルトのライブラリ パス (/lib/ や /usr/lib など)

動的ライブラリの場所と、より高い優先度の合計rpathrunpathこれら 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.cachld.sold-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 89 2019 dyninst-x86_64.conf
-rw-r--r-- 1 root root 17 43 2020 mariadb-x86_64.conf
-rw-r--r-- 1 root root 26 61 2020 bind-export-x86_64.conf
-r--r--r-- 1 root root 63 826 2020 kernel-3.10.0-1127.19.1.el7.x86_64.conf
#ldconfig

その後、ldconfigディレクトリを/etc/ld.so.cachファイルに更新させることで、ldconfig -pキャッシュにキャッシュされた動的ライブラリとそのパス情報が書き込まれているかどうかを確認できます ( ldconfig -p | grep 依赖的动态库)。

おすすめ

転載: blog.csdn.net/mo4776/article/details/129695085