Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxダイナミックリンクライブラリとスタティックリンクライブラリに関するいくつかの概念

Linuxダイナミックリンクライブラリとスタティックリンクライブラリに関するいくつかの概念

  
ライブラリ概要

ライブラリはダイナミックおよびスタティックで、ダイナミクスは通常.soをサフィックスとして、staticを.aとサフィックスとして使用します。 libhello.so libhello.a

同じシステムで異なるバージョンのライブラリを使用するには、プログラム接続のデフォルトのため、ライブラリファイル名の後にバージョン番号をサフィックスに追加できます。ファイル拡張子として.soを使用します。そのため、これらのライブラリを使用するためには、シンボリック接続を確立する方法を使用するのが一般的です。
ln -s libhello.so.1.0 libhello.so.1ln -s libhello.so.1 libhello.soライブラリーの使用

静的ライブラリーを使用したい場合、コネクターはプログラムを見つけます。必要な関数が実行可能ファイルにコピーされ、このコピーが完了すると、接続が成功すると、静的ライブラリは不要になります。ただし、これは動的ライブラリの場合は当てはまりません。動的ライブラリはエグゼキュータにマークを付けます - プログラムが実行されるとき、ライブラリが最初にロードされなければならないことを示します。動的ライブラリーはスペースを節約するため、Linuxで接続するためのデフォルトの操作は、まず動的ライブラリーを接続することです(つまり、静的ライブラリーと動的ライブラリーが同時にある場合、指定されていない場合は動的ライブラリーと接続します)。

helloというプログラム開発パッケージがあるとします。このパッケージは、静的ライブラリlibhello.a、動的ライブラリlibhello.so、ヘッダーファイルhello.hを提供し、ヘッダーファイルはsayhello()関数を提供します。
/* hello.h * /void sayhello();

ドキュメントもいくつかあります。この典型的なプログラム開発パッケージの構造

1.動的ライブラリと接続する

Linuxのデフォルトは動的ライブラリと接続することです。次のプログラムtestlib.cはhelloライブラリでsayhello()を使用します。機能
/*testlib.c*/#include#includeint main(){sayhello(); return 0;}

次のコマンドでコンパイルします。
$ gcc -c testlib.c -o testlib.o

次のコマンドで接続します。
$ gcc testlib.o -lhello -o testlib

接続時には、libhello.soとlibhello.aの両方がデフォルトのライブラリ検索パス/usr /にあると想定します。 libの下で、他の場所に-Lパラメータを追加したい場合

2.静的ライブラリとの接続

静的ライブラリとの接続、主にパラメータの問題は面倒です。または上記の例:
$ gcc testlib.o -o testlib -WI、-Bstatic -lhello

注:この特別な" -WI、-Bstatic"パラメータは、実際にはコネクタldに渡されます。システムに静的ライブラリしかない場合は、静的ライブラリに接続するように指示してください。もちろん、このパラメータは必要ありません。

複数のライブラリに接続したい場合、各ライブラリが異なる方法で接続されている場合、例えば上記のプログラムはlibhelloと静的に接続され、libbyeと動的に接続されるべきです。
$ gcc testlib.o -o testlib -WI -Bstatic -lhello -WI -Bdynamic -lbye

3.動的ライブラリのパス問題

実行可能ファイルが動的ライブラリをスムーズに見つけるために、 3つの方法があります。

(1)ライブラリを/usr /libディレクトリと/libディレクトリにコピーします。

(2)環境変数LD_LIBRARY_PATHにライブラリのパスを追加します。たとえば、動的ライブラリlibhello.soは/home /ting /libディレクトリにあり、bashを例として使用します:
$ export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/home /ting /lib

(3)変更/etc /ld.so.confファイルは、ライブラリが存在する場所へのパスをファイルの末尾に追加し、ldconfigの更新を実行します。このようにして、追加されたディレクトリ内のすべてのライブラリファイルが表示されます。

4.ライブラリ内のシンボルの表示

場合によっては、ライブラリ内の関数を確認する必要があります。関係するすべてのシンボルライブラリは静的でも動的でもかまいません。 nmでリストされた多くのシンボルがあります、一つはライブラリで呼ばれますが、ライブラリで定義されていない(他のライブラリサポートが必要であることを示す)、Uによって表される3つの共通のシンボルがあります。これはTで最も一般的なもので、もう1つはいわゆる「弱い」シンボルで、ライブラリで定義されていますが、他のライブラリでも同じ名前のシンボルでカバーされることがあります。たとえば、前のセクションで説明したhelloライブラリでprintf()が定義されているかどうかを開発者が知りたいとします。
$ nm libhello.so | Grep printf U printf

Uシンボルprintfは参照されていますが、関数内で定義されていないことを示しています通常helloライブラリを使用するには、他にライブラリサポートが必要です。 Br> $ ldd hellolibc.so.6 => /lib/libc.so.6(0x400la000)/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x40000000)

上記の結果から、printfが最終的に定義された場所を確認できます。次に進むことができます。

ライブラリの生成

最初のステップは、ソースコードをターゲットコードにコンパイルすることです。例として次のコードを使用して、上記で使用したhelloライブラリを生成します。
/* hello.c * /#includevoid sayhello(){printf(" hello、world \\ n");}

gccで編集绎このファイルは、デバッグコードを追加するための-gなど、フルメソッドのコンパイルパラメータを編集するために使用できます。
gcc -c hello.c -o hello.o

1.静的ライブラリへの接続br>

arコマンドを使用して静的ライブラリに接続します。実際、arはアーカイブの意味です。$ ar cqs libhello.a hello.o

2.動的ライブラリに接続します。

動的ライブラリを生成します。複数のバージョンが存在する可能性があるため、GCCを完了します。通常、バージョン番号を指定します。
$ gcc -shared -Wl、-soname、libhello.so.1 -o libhello.so.1.0 hello.o

追加2つのシンボリックリンクを作成します。
$ ln -s libhello.so.1.0 libhello.so.1 $ ln -s libhello.so.1 libhello.so

libhelloダイナミックリンクライブラリが生成されます。最も重要なことは、gcc -sharedパラメータを渡して通常のexecutorではなく動的ライブラリにすることです。 -Wlは、以下のパラメーターが-sonameであることを意味します。libhello.so.1は、処理のためにコネクターldに直接渡されます。コネクターが探しているライブラリー内に名前を見つけると、コネクターは実行中の実際のファイル名の代わりに、リンク内のバイナリーにそのソナメを埋め込みます。プログラムの実行中、プログラムはライブラリのファイル名ではなく、sonameの名前のファイルを探します(つまり、sonameはライブラリの識別フラグです)。

これは、システム内に複数のバージョンのライブラリファイルを共存させることを目的としていますライブラリファイルに名前を付けるときは、同じlibxxxx.so.major.minorを使用するのが一般的です。 Xxxxはライブラリーの名前、majorはメジャーバージョン番号、minorはマイナーバージョン番号です。

Copyright © Windowsの知識 All Rights Reserved