静的ライブラリの統合
    Top > Linux > コンパイル
    このページを作った理由
     後述するように,静的ライブラリの統合の方法に関する(日本語の)記事は既に存在するし,特に新しい情報があるわけでもないのだが,  ・万が一参照先の記事が無くなると困る  ・私が遭遇したエラーメッセージからこれらの方法を見つけるのに苦労した 以上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. ライブラリを一度展開し、オブジェクトファイルの状態にしてからまとめる
     参照:   + 静的ライブラリから静的ライブラリを生成する方法| OKWAVE  こんな感じになると思う.
    軽く説明
    ar rv libZ.a libA.a libB.a のようにしてlibZ.aを作っても,中に入っているのはlibA.aとlibB.aであってそれらの元となったオブジェクトファイルではないので,これを使ってコンパイルしようとしてもプログラムがオブジェクトファイルを参照できない,ということらしい.間違ってたらごめん.
    References
    スタティックライブラリ(静的ライブラリ) .a を複数結合するには #Linux - Qiita + https://qiita.com/fault/items/2a3201fc697a2e537906 複数の静的ライブラリ (.a) を結合する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き - + https://pyopyopyo.hatenablog.com/entry/20151110/p1 静的ライブラリから静的ライブラリを生成する方法| OKWAVE + https://okwave.jp/qa/q3435497/a10499440.html