Linux におけるライブラリとヘッダー ファイルの関係: ヘッダー ファイルには関数の宣言があり、ライブラリ ファイルは関数の定義を実装します。ライブラリ内の各関数はヘッダー ファイルで宣言する必要があります。プログラムを作成するときは、ヘッダー ファイルを使用して定数の定義と、システム関数およびライブラリ関数の呼び出しの宣言を行う必要があります。ライブラリとは、コンパイルされた関数の集合、つまりターゲット ファイル ".o" の集合です。これは再利用性の原則に従って記述されており、一般に、共通のタスクを実行するための相互に関連する一連の関数で構成されます。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
一般的なアプリケーションのソース コードでは、ヘッダー ファイルに関数宣言があり、その関数の定義をライブラリ ファイルで実装するため、ライブラリ内の各関数をヘッダー ファイルで宣言する必要があります。
プログラムを作成するときは、ヘッダー ファイルを使用して、定数、システム関数、ライブラリの定義を提供する必要があります。これらのヘッダー ファイルは /usr/include
にあります。これらのヘッダー ファイルは、X ウィンドウ システムの /usr/include/X11 や GNU C の /usr/include /c など、コンパイラによって自動的に検索できるディレクトリにあります。
gcc を呼び出すとき、フラグ -I
を使用して、サブディレクトリまたは他の非標準の場所に保存されたヘッダー ファイル (gcc -I/usr/openwin/ など) を含めることができます。 include fred.c
ライブラリはコンパイルされた関数のコレクション、つまりターゲット ファイル 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
次に、
gcc -c を使用して 2 つのターゲット ファイルをコンパイルし、生成します。
次に main 関数をコンパイルし、main.o を前に生成した bill.o にリンクします。これは正しく実行できます。 #次に、ライブラリ ファイルを作成し、ar を使用してプログラムをアーカイブします。 アーカイブ ファイルを作成し、そこにターゲット ファイルを追加します。これにより、複数の個別のファイルが 1 つの大きなファイルに結合されます。
ar crv libfoo.a bill.o fred.o その後、
ranlib コマンドを使用して関数ライブラリのコンテンツ テーブルを生成する必要があります。
-l を使用し、非標準の場所を指定するには
-L を使用します。
nm コマンドを使用すると、ターゲット ファイル、関数ライブラリ、または実行可能ファイル
に含まれる関数を表示できます。分解解析が可能です。プログラムを作成するとき、関数ライブラリには実際に必要な関数だけが含まれており、ヘッダー ファイルにはすべての関数の宣言がありますが、リンカはそれらをすべてリンクしません。
Linux と Windows の静的ライブラリの比較
プログラムが関数ライブラリを使用する場合、リンク時には関数コードが含まれなくなりますが、実行時にアクセスできる共有コードが参照されます。コンパイルされたプログラムが実行のためにメモリにロードされると、関数参照が解析され、呼び出しが行われます。共有ライブラリにロードされ、必要に応じて共有ライブラリがメモリにロードされます。つまり、システムは、多くのアプリケーションが呼び出すために共有ライブラリのコピーを 1 つだけメモリ内に保持することも、外部メモリに 1 つのコピーだけを保持することもできます。さらに、共有ライブラリは、それに依存するアプリケーションとは独立して更新でき、アプリケーションを再コンパイルする必要はありません。 Linux システムでは、共有ライブラリのロードとクライアント プログラムによって参照される関数の解析を担当するプログラム (ダイナミック ローダー) は
ld.so
gcc -shared -fpic -o libfoo.so bill .o fred .o
/etc/ld.so.conf で構成できます。このファイルを変更した後、コマンド
ldconfig を実行してファイルを処理します。
/etc/ld.so.conf の内容は
include /etc/ld.so.conf.d/*.conf です。このディレクトリに独自の動的ファイルを作成します。リンク ライブラリ パス設定ファイル
#mylib.conf
#実行可能ファイルを生成するためのリンク
gcc -o main project.o -lfoo -L.ツールは次のとおりです。分析に使用される 実行可能ファイルの実行に必要な共有ライブラリ
##ターゲット コードをコンパイルするときに、gcc パラメーターを使用して .so ライブラリの検索パスを指定することもできます-Wl,- rpath
は、gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl のように指定されており、次のパラメータがlink プログラム ld (gcc が自動的に ld を呼び出すため) 動的ライブラリの検索パスを複数指定する場合は、パスをコロン「:」で区切ります。
関連する推奨事項: 「Linux ビデオ チュートリアル
」以上がLinux のライブラリとヘッダー ファイル間の関係は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。