ホームページ  >  記事  >  運用・保守  >  Linux のライブラリとヘッダー ファイル間の関係は何ですか?

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

青灯夜游
青灯夜游オリジナル
2023-03-16 10:27:121410ブラウズ

Linux におけるライブラリとヘッダー ファイルの関係: ヘッダー ファイルには関数の宣言があり、ライブラリ ファイルは関数の定義を実装します。ライブラリ内の各関数はヘッダー ファイルで宣言する必要があります。プログラムを作成するときは、ヘッダー ファイルを使用して定数の定義と、システム関数およびライブラリ関数の呼び出しの宣言を行う必要があります。ライブラリとは、コンパイルされた関数の集合、つまりターゲット ファイル ".o" の集合です。これは再利用性の原則に従って記述されており、一般に、共通のタスクを実行するための相互に関連する一連の関数で構成されます。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。

一般的なアプリケーションのソース コードでは、ヘッダー ファイルに関数宣言があり、その関数の定義をライブラリ ファイルで実装するため、ライブラリ内の各関数をヘッダー ファイルで宣言する必要があります。

1. ヘッダー ファイル

プログラムを作成するときは、ヘッダー ファイルを使用して、定数、システム関数、ライブラリの定義を提供する必要があります。これらのヘッダー ファイルは /usr/include にあります。これらのヘッダー ファイルは、X ウィンドウ システムの /usr/include/X11 や GNU C の /usr/include /c など、コンパイラによって自動的に検索できるディレクトリにあります。

gcc を呼び出すとき、フラグ -I を使用して、サブディレクトリまたは他の非標準の場所に保存されたヘッダー ファイル (gcc -I/usr/openwin/ など) を含めることができます。 include fred.c

2. ライブラリ ファイル

ライブラリはコンパイルされた関数のコレクション、つまりターゲット ファイル A .o のコレクションは再利用性の原則に従って記述されており、一般に、共通のタスクを実行するための相互関連する関数のセットで構成されます。

標準 Linux システム ライブラリ ファイルは通常、/lib および /usr/lib ディレクトリに保存されます。デフォルトでは、GCC リンカーは標準 C 言語ライブラリのみを検索しますが、これは歴史的な問題です。ライブラリ ファイル名を特定の規則に準拠させ、コマンド ラインで指定する必要があります。

ライブラリ ファイルは常に lib で始まり、それがどのライブラリであるかを示します。最後の部分 .a は静的関数ライブラリを表し、.so は共有関数ライブラリ (つまり、動的 DLL Windows ではリンク ライブラリ)。

gcc -o fred fred.c /usr/lib/libm.a または gcc -o fred fred.c -lm
など-L フラグは、gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11

など、リンカーのライブラリ検索パスを増やします。 ##2.1 静的ライブラリ

静的ライブラリは .a で終わり、アーカイブ ファイルとも呼ばれます。実行可能プログラムを生成するときに、静的ライブラリ ファイルがリンクされ、生成された実行可能ファイル ファイルは大きくなり、静的ライブラリ ファイルなしで実行できます。

2.1.1 生成方法

最初に 2 つのソース ファイル fred.c と bill.c

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

次に、

gcc -c を使用して 2 つのターゲット ファイルをコンパイルし、生成します。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

次に、これら 2 つのファイルについて各関数のヘッダー ファイルを作成し、関数宣言を作成します。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

次に、ヘッダー ファイルを main 関数に組み込み、ライブラリ関数の 1 つを呼び出します

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

次に main 関数をコンパイルし、main.o を前に生成した bill.o にリンクします。これは正しく実行できます。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

#次に、ライブラリ ファイルを作成し、ar を使用してプログラムをアーカイブします。 アーカイブ ファイルを作成し、そこにターゲット ファイルを追加します。これにより、複数の個別のファイルが 1 つの大きなファイルに結合されます。

ar crv libfoo.a bill.o fred.o その後、ranlib コマンドを使用して関数ライブラリのコンテンツ テーブルを生成する必要があります。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

次に、ライブラリ ファイルを前に生成した Program.o ファイルにリンクすると、実行は成功します。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

また関数ライブラリを指定するには

-l を使用し、非標準の場所を指定するには -L を使用します。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

nm コマンドを使用すると、ターゲット ファイル、関数ライブラリ、または実行可能ファイル に含まれる関数を表示できます。分解解析が可能です。プログラムを作成するとき、関数ライブラリには実際に必要な関数だけが含まれており、ヘッダー ファイルにはすべての関数の宣言がありますが、リンカはそれらをすべてリンクしません。

Linux のライブラリとヘッダー ファイル間の関係は何ですか?

1Linux のライブラリとヘッダー ファイル間の関係は何ですか?

Linux と Windows の静的ライブラリの比較

1Linux のライブラリとヘッダー ファイル間の関係は何ですか?

2.2 共有ライブラリ

##多くのアプリケーションが同時に実行され、すべてが同じ関数ライブラリの関数を使用する場合、メモリ内に同じ関数のコピーが多数存在します。メモリと外部ストレージを無駄にします。 !

プログラムが関数ライブラリを使用する場合、リンク時には関数コードが含まれなくなりますが、実行時にアクセスできる共有コードが参照されます。コンパイルされたプログラムが実行のためにメモリにロードされると、関数参照が解析され、呼び出しが行われます。共有ライブラリにロードされ、必要に応じて共有ライブラリがメモリにロードされます。つまり、システムは、多くのアプリケーションが呼び出すために共有ライブラリのコピーを 1 つだけメモリ内に保持することも、外部メモリに 1 つのコピーだけを保持することもできます。さらに、共有ライブラリは、それに依存するアプリケーションとは独立して更新でき、アプリケーションを再コンパイルする必要はありません。 Linux システムでは、共有ライブラリのロードとクライアント プログラムによって参照される関数の解析を担当するプログラム (ダイナミック ローダー) は
ld.so

です。 #2.2.1 生成方法

中間ファイル bill.o fred.o を使用して共有ライブラリ libfoo.so を生成します

gcc -shared -fpic -o libfoo.so bill .o fred .o

1Linux のライブラリとヘッダー ファイル間の関係は何ですか?

共有ライブラリが生成されたら、それを標準の検索ディレクトリに配置する必要があります。共有ライブラリを検索するための追加の場所は、ファイル

/etc/ld.so.conf で構成できます。このファイルを変更した後、コマンド ldconfig を実行してファイルを処理します。
/etc/ld.so.conf の内容は include /etc/ld.so.conf.d/*.conf です。このディレクトリに独自の動的ファイルを作成します。リンク ライブラリ パス設定ファイル #mylib.conf

1Linux のライブラリとヘッダー ファイル間の関係は何ですか?

次に、検索パスを指定します

1Linux のライブラリとヘッダー ファイル間の関係は何ですか? #実行可能ファイルを生成するためのリンク

gcc -o main project.o -lfoo -L.

1Linux のライブラリとヘッダー ファイル間の関係は何ですか?

ldd

ツールは次のとおりです。分析に使用される 実行可能ファイルの実行に必要な共有ライブラリ

##ターゲット コードをコンパイルするときに、gcc パラメーターを使用して .so ライブラリの検索パスを指定することもできます1Linux のライブラリとヘッダー ファイル間の関係は何ですか?-Wl,- rpath

は、

gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl のように指定されており、次のパラメータがlink プログラム ld (gcc が自動的に ld を呼び出すため) 動的ライブラリの検索パスを複数指定する場合は、パスをコロン「:」で区切ります。

関連する推奨事項: 「1Linux のライブラリとヘッダー ファイル間の関係は何ですか?Linux ビデオ チュートリアル

以上がLinux のライブラリとヘッダー ファイル間の関係は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。