2つの static library, libX.a と libY.a を結合して libAll.a を生成する方法です
この記事は 複数の静的ライブラリ (.a) を結合する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き - の改訂版です
Linux の場合 (方法1)
ar scripts を使います.
ar scripts (GNU Binary Utilities)
具体的にはarコマンドに "-M" オプションを付与して起動します.
$ ar -M
すると標準入力からスクリプトを受け付けるので,libAll.a を生成して libX.a と libY.a を追加するスクリプトを入力します
create libAll.a addlib libX.a addlib libY.a save
これを Makefile で自動実行するには次のようなルールを書きます
libAll.a : libX.a libY.a @echo "create $@\n" $(addprefix addlib , $(addsuffix \\n, $^)) "save" | ar -M
動作原理
- create $@ は create libAll.a に置換されます
- $^ は "libX.a libY.a" のリストに置換されます
- $(addsuffix \\n, $^)で "libX.a\n libY.a\n"に置換されます
- $(addprefix addlib , "libX.a\n libY.a\n") は "addlib libX.a\n addlib libY.a\n"に置換されます
まとめると
echo "create libAll.a \n " "addlib libX.a\n addlib libY.a\n" "save"
をまず実行して ar script を stdoutに出力,パイプ経由で ar -M のstdin に渡すことになります
Linux の場合 (方法2)
少し違う Makefile の書き方もあります
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 scriptで変換します.
create libZ.a addlib libZ.a save end
これで新しい libZ.a を作成し,データやコードも含んだ スタティックライブラリを出力します