Linux静的ライブラリと動的ライブラリの詳細を深く検討する(一目でわかる)

4422 ワード

ライブラリは本質的に実行可能なコードのバイナリフォーマットであり、メモリにロードして実行することができる.ライブラリには静的ライブラリと動的ライブラリの2種類があります.
一、静的ライブラリと動的ライブラリの違い
1.静的関数ライブラリ
このクラスのライブラリの名前は一般的に
libxxx.a;静的関数ライブラリでコンパイルされた
ファイルが大きい--関数ライブラリ全体のすべてのデータがターゲットコードに統合されるため、コンパイルされた実行プログラムは外部の関数ライブラリのサポートを必要としないという利点が明らかになりました.すべての使用関数がコンパイルされているからです.もちろん、静的関数ライブラリが変更された場合、プログラムを再コンパイルする必要があるため、これも彼の欠点になります.
2.動的関数ライブラリ
このようなライブラリの名前は一般的にlibxxxです.so;静的関数ライブラリに対して、動的関数ライブラリはコンパイル時に
ターゲットコードにコンパイルされていません.プログラムが関連関数に実行されると、その関数ライブラリの対応する関数が呼び出されます.そのため、動的関数ライブラリによって生成されます.
実行可能ファイルは小さいです.関数ライブラリはあなたのプログラムに統合されていないため、プログラムの実行時です.
動的な購買依頼と呼び出し--時間なので、プログラムの実行環境に適切なライブラリを提供する必要があります.動的関数ライブラリの変更はプログラムに影響しないので、動的関数ライブラリの
アップグレード/更新が便利です.
二、静的ライブラリ
(一)簡単な紹介
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc\
  main.c src/* -I./include -L./lib -lmpi -o main
/opt/hisi-linux/x 86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gccクロスコンパイルツールチェーン
は改行であり、次の行がその行と同じ行であることを示し、''の後ろにスペースを付けることはできません.
    main.c主関数
src/*はソースファイル
-Iコネクタファイル
-L後のライブラリファイルパス
-l後にライブラリファイル名を付けます.フルネームはlibmpiです.a
    .aは静的ライブラリ
(二)静的ライブラリの作成と使用
(1)設計ライブラリのソースコードpr 1.c、pr2.cとmain.c
 
  
[bill@billstone make_lib]$ cat pr1.c
#include
void print1(void)
{
                printf("This is the first lib src!
");
}
[bill@billstone make_lib]$ cat pr2.c
#include
void print2(void)
{
                printf("This is the second src lib!
");
}
[bill@billstone make_lib]$ cat main.c
int main(void)
{
                print1();
                print2();
                return 0;


(2)pr 1をコンパイル.c、pr2.cファイル
 
  
[bill@billstone make_lib]$ gcc -O -c pr1.c pr2.c
[bill@billstone make_lib]$ ls -l pr*.o
-rw-rw-r--        1 bill          bill                    804    4   15 11:11 pr1.o
-rw-rw-r--        1 bill          bill                    804    4   15 11:11 pr2.o

(3)静的ライブラリのリンク
コンパイラでライブラリファイルを正しく見つけるには、静的ライブラリは
lib[name].aのルール命名、以下の例
[name]=pr.
Arパラメータの意味:
r:ライブラリにモジュール(置換)を挿入します.挿入されたモジュール名が既にライブラリに存在する場合、同じ名前のモジュールが置き換えられます.
s:ターゲットファイルインデックスをライブラリに書き込むか、存在するターゲットファイルインデックスを更新します.
v:このオプションは、実行操作オプションの追加情報を表示するために使用されます.
t:ライブラリのモジュールテーブルリストを表示します.一般にモジュール名のみが表示されます.
[bill@billstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
[bill@billstone make_lib]$ ar -t libpr.a
pr1.o
pr2.o
(4)リンクオプションのコンパイル
-Lおよび-lのパラメータは後ろに置く.ここで、-Lはライブラリファイルのパスをロードし、-lはライブラリファイルの名前を示す.
[bill@billstone make_lib]$ gcc -o main main.c-L./-lpr//mainの生成
(5)実行対象プログラム[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!
三、ダイナミックライブラリ(暗黙呼び出し)
(1)設計ライブラリコード
 
  
[bill@billstone make_lib]$ cat pr1.c
#include
int p = 2;
void print(){
                printf("%p:%d
", &p, p);
                printf("This is the first dll src!
");
}

(2)動的ライブラリxxxを生成する.so
 
  
[bill@billstone make_lib]$ gcc -O -fpic -shared -o xxx.so pr1.c
[bill@billstone make_lib]$ ls -l *.so
-rwxrwxr-x        1 bill          bill                  6592    4   15 15:19 xxx.so

(3)ダイナミックライブラリの暗黙呼び出し
 
  
[bill@billstone make_lib]$ cat main.c
int main()
{
       print();
       return 0;
}
[bill@billstone make_lib]$ gcc -o main main.c ./xxx.so
[bill@billstone make_lib]$ ./main
0x97b5d4:2
this is the first lib src!


ダイナミックライブラリの場所が変更されると、プログラムは正常に動作しません.動的ライブラリが静的ライブラリに取って代わる利点の1つは、動的ライブラリを更新することによって、ライブラリの内容を随時アップグレードすることである.