Linuxダイナミックライブラリとスタティックライブラリの概念、作成、使用

動的および静的ライブラリ

ライブラリのリンク方法:gcc / g ++コンパイラのデフォルトのリンク方法はダイナミックリンクです。
ダイナミックリンク:動的ライブラリをリンクして実行可能プログラムを生成することは、ライブラリ内の関数の実装命令を直接取得して書き込むことはありません。実行可能プログラム。実行可能プログラムは、ライブラリ内の関数のシンボル情報テーブルを記録します。実行可能プログラムを実行するときは、ダイナミックライブラリをメモリにロードします。ダイナミックライブラリが存在しない場合、プログラムは実行できません。
静的リンク:静的ライブラリをリンクして実行可能プログラムを生成し、ライブラリで使用する関数の実装コード命令を実行可能プログラムファイルに直接書き込みます。プログラムの実行時に依存関係はありません。
ここに画像の説明を挿入します
ダイナミックリンクの長所と短所:生成された実行可能ファイルは比較的小さく、ランタイムライブラリはメモリに読み込まれ、複数のプログラムが同じメモリ内ライブラリ関数コードを使用できます。短所は、ランタイムがに依存する必要があることです。存在しないダイナミックライブラリの存在実行できず、読み込み速度が遅い。

静的リンクの長所と短所:プログラムは他の依存関係なしで実行され、直接実行できます。読み込み速度は速いですが、実行可能プログラムは比較的大きく、複数のプログラムが同じライブラリ内の関数を使用する場合、このコードは関数には実行時にメモリがあります同じライブラリ関数コードの複数のコピーがあり、冗長性が発生します。

コードを書くときは、再利用される関数やコードがたくさんあります。ライブラリにパッケージ化すると、関数やコードはどこでも使用できるため、プログラミングの効率が大幅に向上します。それでは、ライブラリ関数をパッケージ化する方法を見てみましょう。

動的/静的ライブラリのパッケージ化と使用

サンプルコード:
child.c

//child.c
#include <stdio.h>

int printChild()
{
    
    
    printf("hello WhiteShirtI");
    return 0;
}

child.h

//child.h
int printChild();

main.c

//main.c
#include <stdio.h>
#include "child.h"

int main()
{
    
    
    printChild();
    return 0;
}

ダイナミックライブラリ

1.各.cファイルをコンパイルしてオブジェクトファイルにアセンブルします。2。.soで
gcc -c -fPIC child.c -o child.o
終わるダイナミックライブラリにパッケージ化します。ダイナミックライブラリ
gcc -share child.o -o libmychild.soの命名方法実行可能ファイルを生成するときにリンクして使用するlib***.so
ここに画像の説明を挿入します
方法は3つあり
ます。- gcc main.c -o main -lmychildlはライブラリを指定します。名前
ここに画像の説明を挿入します
しかし、ライブラリファイルが見つからないことがわかりました。リンクする前にライブラリを構成する必要があります。ダイナミックライブラリ
1には3つの方法があります。ライブラリファイルを指定されたパスに配置します。/usr/lib64または/usr/lib
ここに画像の説明を挿入します
システムライブラリに配置すると、汚染されます。ドアの元のライブラリ
2.リンクライブラリの検索パス環境変数を設定します-ライブラリファイルが配置されているパスを追加しますexport LIBRARY_PATH=$LIBRARY_PATH:.
ここに画像の説明を挿入します
。3。gcc-Lオプションを使用して、リンクライブラリの検索パスを指定します。
gcc main.c -o main -L./ -lmychild
ここに画像の説明を挿入します
ldd mainダイナミックを表示ます。実行可能プログラムがメインに依存するライブラリ
ここに画像の説明を挿入します

リンクはできますが、メインプログラムを正常に実行できません。
ここに画像の説明を挿入します

実行可能プログラムの実行時にメソッドをロードして使用する
1.指定したパスにライブラリファイルを配置します。/usr/lib64または/usr/lib64
ここに画像の説明を挿入します
2.リンクライブラリの接続パス環境変数を設定します-ライブラリファイルが配置されているパスを追加します。export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
ここに画像の説明を挿入します
リンクがダイナミックライブラリの場合、実行時に実行されます動的ライブラリをロードする必要があります。リンクが静的ライブラリの場合、実行時にロードする必要はありません。

静的ライブラリ

1.各.cファイルをコンパイルしてオブジェクトファイルにアセンブルします。2。.aで
gcc -c child.c -o child1.o
終わる静的ライブラリにパッケージ化します。静的ライブラリ
ar -cr libmyachild.a child1.oの命名方法lib***.a
ここに画像の説明を挿入します
プログラムを静的ライブラリにリンクする方法:
1。静的ライブラリを指定されたパス
gcc動的ライブラリがデフォルトで使用されますが、静的ライブラリをどのように使用させるのでしょうか。
静的ライブラリをファイルに入れて、リンク時にディレクトリに移動します。ディレクトリには静的ライブラリしかないため、現時点では静的ライブラリのみを使用できますgcc main.c -o main -L./lib -mychild
ここに画像の説明を挿入します
。2 すべてのライブラリに静的リンクを使用しますgcc -static main.c -o main -L./lib -lmychild
ここに画像の説明を挿入します
新しいバージョンではインストール時にLinuxシステムではglibc-devel、glibc、gcc-c ++の場合、libc.aはインストールされません。libc.soのみがインストールされます。したがって、-staticを使用すると、libc.aは使用できません。libcが見つからないことのみを報告できます。
解決策:
glibc-staticをインストールします
sudo yum install glibc-static

おすすめ

転載: blog.csdn.net/qq_44443986/article/details/115007235