静的ライブラリを作る
いつも忘れてしまうので個人的メモ
静的ライブラリっていうのは
要はただのオブジェクトファイル(*.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
とすると削除される
ライブラリを使いたい
- まずlibHoge.a内にある全ての関数についてのヘッダファイルを用意して、使いたいソースの中でインクルードする(要は関数の先行宣言の羅列)
- ライブラリの置いてあるディレクトリを確認する(ここでは../lib/とします)
- そのディレクトリの場所を-Lオプションで指定する(../lib/の場合は-L../lib/)
- コンパイル時に-lHogeというオプションを付け加える
こんな感じになる
% gcc -o main main.c -L../lib/ -lHoge
あと、-l オプションはリンカオプションなので、コンパイルするファイル名の後に置く必要があるので注意
何が便利なんだろうか
こんなことしなくても
% gcc -o main main.c hoge1.o hoge2.o
でいいんですが、C言語だとどうしてもファイルの数が多くなるのでこうやって1つにまとめておくと便利だったりする