linux動、静的ライブラリの生成と使用

7252 ワード

Linuxのダイナミックライブラリファイルの拡張子は「.so」(Shared Object)です.約束通り、すべてのダイナミックライブラリファイル名の形式はlibnameである.so(名前にバージョン番号を入れる可能性があります).静的ライブラリのファイル名形式はlibname.a.
この文書では、ダイナミックライブラリファイルの生成とリンク方法について簡単な例で説明します.
一、ライブラリファイル及びテストファイルコード
ライブラリファイルおよびテストファイルが存在するディレクトリ:/root/so/
1.ライブラリファイル名:myfirstso.c
#include
void myfunction()
{
  printf("this is a shared object");
}
2.テストファイル名:test.c
#include
int main(int argc,char *argv[])
{
        myfunction();
        return 0;
}
二、ダイナミックライブラリのコンパイル方法
ライブラリファイルをコンパイルするc:
[root@mgt so]# gcc -fPIC -shared -o libmyfirstso.so myfirstso.c
コンパイルに成功すると、/root/so/でダイナミックライブラリファイル:libmyfunctionが生成されます.so.
コンパイルによるダイナミックライブラリの生成コマンドは、gcc(-fpic)-shared-o libmyfunction.so myfunction.c
−fpicは、出力されたオブジェクトモジュールを再配置可能なアドレス方式で生成する.
-sharedは、対応するソースファイルを対応するダイナミックリンクライブラリファイルを生成することを指定します.
三、ダイナミックライブラリのテスト方法
テストファイルをコンパイルするc:
[root@mgt so]# gcc -o test test.c/root/so/libmyfirstso.so
コンパイルに成功したら、testファイルを生成し、testを実行します.
[root@mgt so]# ./test
this is a shared object
ここで、gcc-o test test.c/root/so/libmyfirstso.soの最後のパラメータは、リンクされたライブラリファイルの絶対パスを指定します.この例のライブラリファイルの絶対パスは、/root/so/libmyfirstso.so.相対パスを直接書くとエラーが発生します.
もちろん、システムのライブラリファイルパス(通常、システム関数ライブラリの/usr/libの下にある)からダイナミックライブラリをリンクしたい場合は、生成したライブラリファイルを/usr/lib/の下にコピーしてからリンクすることができます.
 
[root@mgt so]# cp libmyfirstso.so/usr/lib
[root@mgt so]# gcc -o test test.c -lmyfirstso
[root@mgt so]# ./test
this is a shared object
ここでは、リンクの仕方について説明します.gcc-o test testについて.c-lmyfunctionの最後のパラメータ-lmyfirstsoは、Cコンパイラに渡されるコマンドラインパラメータが関数ライブラリの完全なパス名に言及していないことを示し、関数ライブラリディレクトリのファイルの完全な名前にも言及していないことを示しています.実際、コンパイラは、オプション-lmyfirstsoに従って対応する関数ライブラリ(/usr/libの下で、64のシステムであれば/usr/lib 64)にリンクする、関数ライブラリの名前はlibmyfirstsoであることに注意する.so,すなわち,「lib」部分とファイルの拡張子は省略されるが,前にlを1つ加えた.
ライブラリはソフトウェアコンポーネント技術であり、ライブラリにはデータと関数がカプセル化されています.
ライブラリの使用により、プログラムをモジュール化できます.
Windowsシステムには、静的リンクライブラリ(.libファイル)と動的リンクライブラリ(.dllファイル)が含まれます.
Linuxは通常、ライブラリファイルを/usr/libまたは/libディレクトリの下に保存します.
Linuxライブラリのファイル名は、プレフィックスlib、ライブラリ名、接尾辞の3つの部分から構成され、動的リンクライブラリは.soが最も接尾辞である、静的リンクライブラリは通常.aを接尾辞とする.
プログラムで静的ライブラリと動的ライブラリを使用する場合、ロードの順序は異なります.
静的ライブラリのコードは、コンパイル時にコピーされるアプリケーションで、コンパイル時間を節約する利点があります.
ダイナミックリンクライブラリ時プログラムは、実行開始後にライブラリ関数を呼び出すとロードされます.
静的ライブラリの作成と使用:
1.静的ライブラリからエクスポートされた関数を1つのヘッダファイル種で宣言します.
2、1つのソースファイル種で静的ライブラリから導出された関数を実現する.
3、ソースファイルをコンパイルし、実行可能コードを生成する.
4、実行可能コードが存在するターゲットファイルをある静的ライブラリに追加し、静的ライブラリをシステムのデフォルトのリポジトリファイルのディレクトリにコピーする.
次に、mylib.h種は静的ライブラリがユーザに提供する関数の宣言であるmylib.c mylibを実現h種宣言の関数.
ヘッダファイル:mylib.h
#ifndef _MYLIB_H_
#define _MYLIB_H_
 
void weclome(void);
void outString(const char *str);
 
#endif

ソースファイル:mylib.c
#include "mylib.h"
#include 
 
void welcome(void)
{
    printf("welcome to libmylib
"
); }   void outString(const char *str) { if(str != NULL) printf("%s
"
, str); }

1>mylibのコンパイルc生成対象ファイル:gcc-o mylib.o -c mylib.c
2>ターゲットファイルを静的ライブラリに追加する:arrcs libmylib.a mylib.o
3>静的ライブラリcopyをLinuxのライブラリディレクトリ(/usr/libまたは/lib)の下に移動します.
cp libmylib.a/usr/lib/libmylib.a 
呼び出しライブラリ関数のテストプログラムtestを作成する.c:
#include "mylib.h"
#include 
 
int main(void)
{
    printf("create and use library:
"
); welcome(); outString("it's successful
"
);   return 0; }

4>静的ライブラリを使用するコンパイル:gcc-o test test.c -lmylib
ここでは、コンパイル時に接頭辞と接尾辞を付ける必要はありません.
5>実行可能プログラムの実行test:./test
create and use library:
welcome to libmylib
it's successful

Linxuでは、arコマンドを使用して静的ライブラリを作成および変更できます.
これらはlinuxの下でmanarがすぐにパラメータを得ることができて、ここでいくつかのよく使うことを説明します
d:ライブラリからメンバーファイルを削除します.
r:ライブラリにメンバーファイルを追加し、存在する場合は置き換えます.
c:ライブラリを作成します.
s:arコマンドがライブラリコンテンツを変更したかどうかにかかわらず、ライブラリシンボルテーブルの再生成を強制します.
他の命令は時々manする.
上の5つのステップは基本的な使用で、また必要があれば、深く勉強しなければなりません.