このページを作った理由
後述するように,静的ライブラリの統合の方法に関する(日本語の)記事は既に存在するし,特に新しい情報があるわけでもないのだが,
・万が一参照先の記事が無くなると困る
・私が遭遇したエラーメッセージからこれらの方法を見つけるのに苦労した
以上2点の理由からこのページを作ることにした.
遭遇したエラー文はこちら:
error adding symbols: Archive has no index; run ranlib to add one
以下,方法の説明.
ここではlibA.a, libB.aを統合してlibZ.aを作る.
方法1. 一旦thin archive形式のファイルを作ってから実体を含んだファイルに変換する
参照:
+
スタティックライブラリ(静的ライブラリ) .a を複数結合するには #Linux - Qiita
+
複数の静的ライブラリ (.a) を結合する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -
ちなみにこれらの記事は書いている内容も文言もほぼ同じ.同じ人が書いたのかな?
以下はこれらの記事の引用(加筆あり).
thin archive形式のファイルを作成する
作成されるファイル
(libZ.a)は
thin archive形式.
以下の情報を保持しているだけで,この段階では実体そのものは含んでいない.
・シンボルテーブル
・元ファイルのパス
thin archive形式のファイルをarコマンドで変換する
arコマンドに
"-M"オプションを付与することで
arをインタプリタモードで起動し,以下を実行する.
これで実体を含んだ静的ライブラリが完成する.
インタプリタモードを起動せず
echoコマンドを利用する場合は以下.
または
よって
Makefileに書く場合は次のようになる.
最後のコマンドでは,インタプリタモードで実行するコマンド群をパイプで受け渡している.
方法2. ライブラリを一度展開し、オブジェクトファイルの状態にしてからまとめる
軽く説明
ar rv libZ.a libA.a libB.a
のようにしてlibZ.aを作っても,中に入っているのはlibA.aとlibB.aであってそれらの元となったオブジェクトファイルではないので,これを使ってコンパイルしようとしてもプログラムがオブジェクトファイルを参照できない,ということらしい.間違ってたらごめん.