Linux,静的ライブラリ(.a)を作成する

スポンサーリンク

鍛錬 125

Linux,静的ライブラリ(.a)を作成する

ライブラリに追加する関数の作成から、実際にライブラリを作成するまでの、一連の流れについてです。

スポンサーリンク

1. ライブラリとして使用する関数を作成する

まずは、ライブラリとして使用する関数を作成します。

今回は、関数を 2 つ含むライブラリを作成します。

以下は、作成する関数についてです。

関数名 機能 関数が記述されているファイル名
PrintFruitsName() フルーツの名前を表示する。 print_fruits_name.c
PrintPrice() 価格を表示する。 print_price.c

以下は、プログラム print_fruits_name.c と、print_price.c です。

print_fruits_name.c

 
print_price.c

スポンサーリンク

2. ライブラリ用のヘッダーファイルを作成する

以下は、ライブラリ用のヘッダーファイル sample_lib.h です。

// prototype
void PrintFruitsName(char *name);
void PrintPrice(int price);
スポンサーリンク

3. オブジェクトファイルを作成する

作成した 2 つのプログラムを個別にコンパイルし、ライブラリに追加するためのオブジェクトファイルを作成します。

コンパイルを行う際、実行ファイルを作成せずにオブジェクトファイルを作成するには、-c オプションを付加します。

以下は、次の順序で実行しています。

  1. ディレクトリの内容を確認。
  2. コンパイルを実行し、オブジェクトファイルを作成。
  3. オブジェクトファイルが作成されたか確認。
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ls
print_fruits_name.c  print_price.c  sample_lib.h
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra -c print_fruits_name.c print_price.c
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ls *.o
print_fruits_name.o  print_price.o

 
上記に示した通り、2 つのオブジェクトファイル print_fruits_name.o と print_price.o が作成されました。

スポンサーリンク

4. 作成した 2 つの関数を呼び出すプログラムを作成する

以下は、作成した 2 つの関数を呼び出すプログラム sample_main.c です。

#include <stdio.h>
#include <string.h>
#include "sample_lib.h"

int main(void)
{
	char fruits_name[256] = "";
	int price;
	
	// 初期化
	strncpy(fruits_name, "apple", sizeof(fruits_name) - 1);
	price = 500;
	
	// フルーツ名を印字
	PrintFruitsName(fruits_name);
	
	// 価格を印字
	PrintPrice(price);
	
	return 0;
}
スポンサーリンク

5. ライブラリの作成前に、テストを行う

まずは、作成したプログラム sample_main.c のオブジェクトファイルを作成します。

コンパイルを行う際、実行ファイルを作成せずにオブジェクトファイルを作成するには、-c オプションを付加します。

以下は、次の順序で実行しています。

  1. コンパイルを実行し、オブジェクトファイルを作成。
  2. オブジェクトファイルが作成されたか確認。
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra -c sample_main.c
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ls *.o
print_fruits_name.o  print_price.o  sample_main.o

 
上記に示した通り、オブジェクトファイル sample_main.o が作成されました。

次に、以前に作成した 2 つのオブジェクトファイル print_fruits_name.o , print_price.o と、今回作成したオブジェクトファイル sample_main.o をリンクして、実行ファイル sample を作成します。

以下は、次の順序で実行しています。

  1. 実行ファイル sample を作成。
  2. 実行ファイルが作成されたか確認。
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra sample_main.o print_fruits_name.o print_price.o -o sample
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ls sample
sample

 
次に、作成したプログラムを実行してテストを行います。

以下は、プログラム sample を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ./sample
fruits name = apple
price = 500

 
上記に示した通り、プログラムは正常に実行されました。

6. ライブラリを作成する

ライブラリを作成するには、ar を使用します。

使用方法は、以下に示す通りです。

ar オプション ライブラリ名 オブジェクトファイル名

以下は、今回 ar を実行する際に使用するオプションについての説明です。

オプション 機能
c 書庫を「作成」する。
書庫を「更新」する操作の場合、
指定した書庫がない場合は「作成」される。
r 書庫に「挿入」し、同名のファイルが存在する場合は「置換」する。
操作前から書庫に存在するメンバーと、追加したメンバーが同名の場合、
操作前から書庫に存在するメンバーは「削除」される。
v 操作についての詳細な情報を表示する。

 
以下は、次の順序で実行しています。

  1. ライブラリ libsample.a を作成。
  2. ライブラリが作成されたか確認。
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ar crv libsample.a print_fruits_name.o print_price.o
a - print_fruits_name.o
a - print_price.o
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ls libsample.a
libsample.a

 
上記に示した通り、2 つのオブジェクトファイル print_fruits_name.o と print_price.o を含むライブラリ libsample.a が作成されました。

7. 作成したライブラリを使用してコンパイルする

作成したライブラリ libsample.a を使用して、プログラム sample_main.c をコンパイルします。

以下は、コンパイルの際に使用するオプションについての説明です。

オプション 機能
-L/ディレクトリ名 ライブラリを検索するディレクトリを指定する
-l/ライブラリ名 ライブラリ名を指定する

上記オプションのライブラリ名の部分には、以下に示す通り、lib と .a を除いて記述します。

ライブラリ名が libsample.a の場合

-lsample

 
以下は、次の順序で実行しています。

  1. ライブラリ libsample.a を使用して、プログラム sample_main.c をコンパイル。
  2. 実行ファイル sample が作成されたか確認。
  3. 実行ファイル sample を実行。

(以下の実行結果について、ディレクトリを指定してライブラリを検索する際に、
「-L/***/***/***/test/c」と、アスタリスク * を記述していますが、これは本記事の作成時に一部ディレクトリ名を伏せ字としているためです。)

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra sample_main.c -o sample -L/***/***/***/test/c -lsample
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ls sample
sample
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ ./sample
fruits name = apple
price = 500

 
上記に示した通り、ライブラリを使用してコンパイルに成功し、プログラムを実行すると正常に動作することが確認できました。

タイトルとURLをコピーしました