複数の静的ライブラリ (.a) を結合する方法

(2019年11月15日,更新) 改訂版を新しく書きました
pyopyopyo.hatenablog.com



2つの static library, libX.a と libY.a を結合して libZ.a を生成するには

$ ar cqT libZ.a libX.a libY.a

で一旦 thin archive形式の libZ.a を生成し,

$ echo "create libZ.a\naddlib libX.a libY.a\nsave\nend" | ar -M

再度 ar コマンドを使って通常のarchive形式に変換します

同じ手続きを Makfile に書くときは

libZ.a: libX.a libY.a
        $(RM) $@
	$(AR) cqT $@ $^
	echo "create $@\naddlib $@\nsave\nend" | ar -M

とします

動作原理

仕組みとしては

$ ar cqT libZ.a libX.a libY.a

で,まず一時的なライブラリとして libZ.a を生成します

この libZ.a は thin archive 形式で作成されていて

  • シンボルテーブル
  • 元ファイルのパス名

のみを保持していて,データやコードの実体は含んでいません

次に thin archive 形式のライブラリを ar コマンドで変換します.ar コマンドに "-M "オプションを付与して ar をインタプリタモードで起動し,以下のプログラムを実行します

create libZ.a
addlib libZ.a
save
end

これで新しい libZ.a を作成し,データやコードも含んだ スタティックライブラリを出力します