Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxプラットフォームでの静的ライブラリと共有ライブラリの使用方法

Linuxプラットフォームでの静的ライブラリと共有ライブラリの使用方法

  

1、Linux関数ライブラリの紹介

関数ライブラリは、メイン関数から分離することができる、事前に書かれた関数の集まりと見なすことができます。開発の再利用性Linuxの関数ライブラリは、静的、共有、動的の3つの形式で使用できます。

1)静的ライブラリのコードはコンパイル時に開発者が開発したアプリケーションに接続されます;

2)そして共有ライブラリはプログラムの実行開始時にのみロードされます。

3)動的ライブラリはプログラムの実行時にもロードされますが、共有ライブラリとは異なり、動的ライブラリが使用するライブラリ関数はプログラムにはロードされませんが、プログラム内のステートメントはその関数を使用する必要があります。ロードのみ動的ライブラリーは、プログラムの実行中に動的ライブラリーによって占有されていたメモリーを解放し、他のプログラムが使用するためのスペースを解放することができます。

注:

l共有ライブラリと動的ライブラリはプログラム内のライブラリ関数の内容を含まないため、ライブラリ関数への参照のみを含むため、コードのサイズは比較的小さくなります。

lシステムで利用可能なライブラリのほとんどは、/usr /local /lib、/usr /lib、/lib、およびディレクトリに格納されています。

lほとんどのヘッダファイルは/usr /include、/usr /local /includeディレクトリにあります。

l共有ライブラリの設定ファイルと管理コマンドは次のとおりです。

/etc/ld.so.conf:共有ライブラリの検索場所。

ldconfig:共有ライブラリ管理ツール。一般に、共有ライブラリを更新した後にこのコマンドを実行します。

ldd:実行可能ファイルによって使用されている共有ライブラリを表示できます。

lライブラリファイル名は、プレフィックスlibと、ライブラリ名とサフィックスで構成され、ライブラリの種類によって、サフィックス名は異なります。


2、ライブラリファイルが多用されている主な理由

1)プログラミングの都合上、一般的に使用される関数については、対応する開発言語が対応するライブラリを提供しています。ファイルサポート

2)特定の機能実装の詳細を隠します。プログラマがライブラリファイルを使用するとき、彼は必要な関数のヘッダファイルをインクルードするだけでよく、関数の特定の実装については気にしません。商用ソフトウェアの場合、その知的所有権も保護されています。


3.これらのライブラリ関数の使い方は何ですか?

どのようなプログラミング環境でも、ライブラリファイルはプリコンパイルされた関数の集まりです。コードフォームはライブラリファイルに格納されています。これらの機能を使用するには、ユーザーはこれらのライブラリファイルをインクルードするだけで済みます。一般に、ライブラリファイルから対応する関数を取得するには2つの方法があります。

1)コンパイル時に、ライブラリ内の対応する関数のバイナリイメージコードが現在コンパイルされているプログラムに直接コピーされ、現在のプログラムは独立して実行されます。このライブラリは静的ライブラリと呼ばれ、Linuxでは.aという接尾辞は静的ライブラリです。

2)コンパイル時には、ライブラリ内の対応する関数のバイナリイメージコードのエントリアドレス(直接コピーされていない)のみが参照されますプログラムは実行時に共有ライブラリファイルから関数コードを読み込みます(最初に必要)この共有ライブラリは、間接的に参照するメモリにロードされます。このライブラリは共有ライブラリと呼ばれ、Linuxではlibxxx.xo.xxの形式で命名されます。


4、使用方法

静的ライブラリ、共有ライブラリ、動的ライブラリの3種類の方法は非常によく似ていますが、オプションを使用するのは' -l'です。 (これは小文字の "L"です)。このオプションは、使用するライブラリファイルを指定するために使用されます。 Linuxの関数ライブラリの命名規則は "ld"; lib'で始まるので、ここのライブラリファイルはlibの内容を入力するだけです。以下のような:; -lm&同じ動的ライブラリファイルのため'が;;のlibm.so、あなただけ書いて&'も呼び出したときに、-lm'静的ライブラリファイルをlibm.aを、ちょうど書い&'呼び出すときに、その全体的なコマンドを呼び出すには次のようになります。

[root @ localhost gcc]#gcc -o動的 - L /root /lq /testc /lib /dynamic.o -lmydynamic

したがって、両方のシステムが存在する場合スタティックライブラリファイルと同じファイル名のダイナミックライブラリファイルを使用する場合、リンクオプションはスタティックライブラリファイルとダイナミックライブラリファイルのどちらを呼び出すのですか。テスト後、システムが動的ライブラリファイルを呼び出していることがわかります。これは、Linuxシステムのデフォルトでは動的リンクを使用するためです。したがって、ユーザーは、静的ライブラリファイルは動的ライブラリのファイルと同じ名前が含まれて呼んで&'したい場合は、明示的にファイル名を記述する必要が後に接尾辞が含まれている、など; -l&':ライブラリlibm.aを呼び出すには'&書き込みする必要があります; -llibm.a - '


1)静的ライブラリファイルlibhello.aがすでにある場合、このライブラリファイルのヘッダーファイルはlibhello.hです。このファイルの内容は次のとおりです。

#ifndef __libhello_H__

に#define __libhello_H__

のボイドprint_hello(無効); //プリントHello Worldの、これは
コンソールへのライブラリです。

#endifの/* __ __ libhello_H * /

上記のコードから、libhello.aライブラリファイルにprint_hello()関数が含まれており、その戻り値の型とパラメータが空であることがヘッダファイルに認識されていることがわかります。したがって、プログラムを書くときは、実装の詳細に関係なく、この関数を(ヘッダーファイルを含めて)使用するだけで済みます。

libhello.aライブラリファイルを使用したサンプルプログラムmain.cは次のとおりです。

#include" libhello.h"

int main(int argc、char ** argv) )

{
print_hello(); //参照ライブラリ関数

return 0;

}

これでmainを置くことができます。 .C、同じディレクトリにコピーlibhello.a、コンパイル:

#のGCC&ndashの; usehello_static usehello.c&ndashのO; lhello //直接libhello.aを使用することができ、最初のバー無し

2)libhello.so.0.0という共有ライブラリファイルが既にある場合は、ここで2つのシンボリックリンクを作成する必要があります(具体的な理由はわかりません)。

#ln– s libhello.so.0 libhello.so.0.0

#ln– s libhello.so libhello.so.0

これら3つのファイルを現在のディレクトリ、このライブラリにコピーできます。 print_hello()関数は、ファイルlibhello.so.0.0に定義されています。; //すなわちprint_hello(

#ifndefの__libhello_H__

に#define __libhello_H__

のボイドprint_hello(無効):次のようなものがありlibhello.hを表示することができますヘッダファイル、この関数は既に有効になっています。

#endif /* __ libhello_H __ * /

同様に、main.cの共有ライブラリファイルで関数を参照することもできます。main.cの内容は次のとおりです。

#include" libhello.h"

int main(int argc、char ** argv)

{

print_hello(); //参照ライブラリ関数

return 0;

}

次に、次のコマンドで接続をコンパイルします(ライブラリファイルlibhello.so.0.0を現在のディレクトリまたはsystem /libにコピーできます)。ディレクトリ):

#のGCC&ndashする;ウォール&ndashする; G&ndashに; C usehello.c&ndashする; O usehello.o //usehello.oバイナリオブジェクトファイル

#のGCC&ndashの;グラム&ndashする; O usehello_dynamic usehello.o&ndashに; L ./-lhello //赤いマーカー参照&'のためのライブラリー専用のコマンドで共有されている; -L dirを'
は、

の実行可能ファイルを生成するには、LDDを使用することができますコマンド実行可能ファイルによって使用される共有ライブラリ。

#ldd usehello_dynamic

「libhello.so.0 =>が見つかりません」というプロンプトが端末に表示されるので、この実行可能ファイルを正しく実行するには、次のコマンドを実行する必要があります。共有ライブラリをライブラリの検索パスに移動します。

#LD_LIBRARY_PATH = $(pwd)./usehello_dynamic

Copyright © Windowsの知識 All Rights Reserved