静的ライブラリを作る

いつも忘れてしまうので個人的メモ

静的ライブラリっていうのは

要はただのオブジェクトファイル(*.o)の集合です
Linuxならファイル名が*.aのものは静的ライブラリで、*.so.*のものは動的ライブラリです(Windowsの場合は*.dll)

オブジェクトファイルの作り方

例えばhoge1.cとhoge2.cというソースがあったら

% gcc hoge1.c hoge2.c -c

でhoge1.oとhoge2.oが作成されます

arコマンドを使って1つにまとめる

ライブラリを作りたいとき
% ar r libHoge.a hoge1.o hoge2.o

これでlibHoge.aが作成されます!

ライブラリの中身を見たいとき
% ar t libHoge.a

とすると

hoge1.o
hoge2.o

と表示される

ライブラリに追加したいとき

例えばさらにhoge3.oというオブジェクトファイルをlibHoge.aに追加したいときは

% ar r libHoge.a hoge3.o

とすると追加される

ライブラリから削除したいとき

やっぱりhoge3.oというオブジェクトファイルはlibHoge.aから削除したい場合

% ar d libHoge.a hoge3.o

とすると削除される

ライブラリを使いたい
  1. まずlibHoge.a内にある全ての関数についてのヘッダファイルを用意して、使いたいソースの中でインクルードする(要は関数の先行宣言の羅列)
  2. ライブラリの置いてあるディレクトリを確認する(ここでは../lib/とします)
  3. そのディレクトリの場所を-Lオプションで指定する(../lib/の場合は-L../lib/)
  4. コンパイル時に-lHogeというオプションを付け加える

こんな感じになる

% gcc -o main main.c -L../lib/ -lHoge

あと、-l オプションはリンカオプションなので、コンパイルするファイル名の後に置く必要があるので注意

何が便利なんだろうか

こんなことしなくても

% gcc -o main main.c hoge1.o hoge2.o

でいいんですが、C言語だとどうしてもファイルの数が多くなるのでこうやって1つにまとめておくと便利だったりする