動的および静的ライブラリ
ライブラリのリンク方法: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 -lmychild
lはライブラリを指定します。名前
しかし、ライブラリファイルが見つからないことがわかりました。リンクする前にライブラリを構成する必要があります。ダイナミックライブラリ
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