理系学生日記

おまえはいつまで学生気分なのか

Archive

アーカイブは、オブジェクトファイルを 1 つのファイルにまとめたものである。リンカにアーカイブを渡すと、リンカは必要なオブジェクトファイルをアーカイブから抽出し、オブジェクトファイルが直接渡されたかのように扱う。
アーカイブは ar コマンドで作成する。

$ ar cr archive.a obj1.o obj2.o

リンカの引数としてアーカイブが与えられた場合、リンカはその時点で未解決の外部参照(シンボル)をそのアーカイブから探そうとする。そのため、アーカイブのコマンドライン上の位置は重要である。
下記の場合、リンカが libtest.a を見つけたときには未解決のシンボルはない。一方、app.o の後にアーカイブは指定されてておらず、app.o 中のシンボルは解決されない。そのため、リンカエラーとなる。

$ gcc -o app -L. -ltest app.o

このように引数を構成すれば、正しくリンクされる。

$ gcc -o app app.o -L. -ltest