読者です 読者をやめる 読者になる 読者になる

スタティックライブラリ

いくつか作った自作の関数をひとまとめのファイルに固めたものをライブラリという・・・。

静的ライブラリを作る - voidy21の日記

ライブラリには、スタティックライブラリと共有ライブラリがあるが、
今回はリンクすることで実行ファイルから使えるようにするスタティックライブラリを作ってみる・・・。

まず、main関数のあるmain.cは、

関数funcを呼び出している・・・。
funcの定義は、func.cにあり、

このように、funcの中で"func!"と出力した後、さらにstatic_1とstatic_2という関数を呼んでいる・・・。

static_1.cのstatic_1の定義は、

static_2.cのstatic_2の定義は、

と、"static_1!"や、"static_2!"を出力している・・・。

今回は、このstatic_1.cとstatic_2.cを合わせて1つのスタティックライブラリにまとめる・・・。

gccの-cオプションでstatic_1.cとstatic_2.cのオブジェクトファイルを作成・・・。

$ ls
func.c  func.h  main.c  static_1.c  static_1.h  static_2.c  static_2.h
$ gcc -c static_1.c static_2.c
$ ls
func.c  main.c      static_1.h  static_2.c  static_2.o
func.h  static_1.c  static_1.o  static_2.h
$

static_1.oとstatic_2.oができたら、arコマンドでこの2つからスタティックライブラリlibstatic.aを作成・・・。
(ライブラリ名はlib○○.aとするのが決まり・・・。理由は後述・・・。)

Man page of ar

$ ar r libstatic.a static_1.o static_2.o
ar: libstatic.a を作成しています
$ ls
func.c  libstatic.a  static_1.c  static_1.o  static_2.h
func.h  main.c       static_1.h  static_2.c  static_2.o
$

あとは、このライブラリをmain.c、func.cとリンクするのだが、

$ gcc -o static_library main.c func.c -L. -lstatic
$ ls
func.c  libstatic.a  static_1.c  static_1.o  static_2.h  static_library
func.h  main.c       static_1.h  static_2.c  static_2.o
$

gccの-oオプションでmain.c, func.cとともに、ライブラリlibstatic.aのあるディレクトリパス、libstatic.aを識別するオプションを付ける必要がある・・・。
ライブラリのディレクトリパスの前には、"-L"を付ける・・・。
libstatic.aはカレントディレクトリ"."にあるから、"-L"に"."を付けて"-L."とする・・・。
ライブラリを識別するオプションは、ライブラリのファイル名"libstatic.a"から"lib"と".a"を取り除いたもの・・・。
つまり"static"・・・。
これの前に"-l"を付けて"-lstatic"とする・・・。(だからライブラリを作る時はlib○○.aとしている・・・。)

これでlibstatic.aをリンクしたstatic_libraryという実行ファイルができた・・・。
実行してみると、

$ ./static_library
func!
static_1!
static_2!
$

funcに加えて、static_1もstatic_2も呼べていることがわかる・・・。

Sample/main.c at master · bg1bgst333/Sample · GitHub
Sample/func.h at master · bg1bgst333/Sample · GitHub
Sample/func.c at master · bg1bgst333/Sample · GitHub
Sample/static_1.h at master · bg1bgst333/Sample · GitHub
Sample/static_1.c at master · bg1bgst333/Sample · GitHub
Sample/static_2.h at master · bg1bgst333/Sample · GitHub
Sample/static_2.c at master · bg1bgst333/Sample · GitHub