- ベストアンサー
静的ライブラリのMake方法
Linuxで静的ライブラリを作成する場合 ar rs [ライブラリ名] [オブジェクトファイル群] コマンドでMakeできると思います。 さて、[オブジェクトファイル群]部分に他の静的ライブラリ"~.a"を含めることは可能でしょうか?? (例) [app.exe] | [lib01.a] | [lib02.a] すでに提供されているlib02.aを含めたlib01.aを作成し、(上のような構成で)実行ファイルを作成したいとします。 その場合以下のような(実際試してないのでこんな感じ)コマンドでいけませんでしょうか? ar rs lib01.a file1.o file2.o lib02.a g++ -o app.exe main.o -L. -lib01.a Makeの可/不可以外にも、賢いMakeの方法および注意点があれば是非ご教授頂ければと思います。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
あ, 「ライブラリの構成が間違ってる」というのは「複数のライブラリが互いに依存しあっている」という構成を指して「間違っている」ということです. 「間違っている」と断定するのも本来はおかしいんですが, 不自然な感じはします. で, 「ar でライブラリからモジュールをとりだして~」というのは, ない方法ではないです. 某数値計算ライブラリのドキュメントで, (性能向上のためモジュールを入れ替えるために) そう書いてあるのを見たことがあります. ともあれ, ライブラリの依存関係が循環することはあんまりないので, 上位のライブラリから順に書いていけばだいたい OK.
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
最後にリンクするときに, コマンドラインでどのように指定してます? 普通のリンカは 1パスなので, ・app.c の中で lib01.a にある関数 (など) を使っている ・lib01.a の中で lib02.a にある関数 (など) を使っている というときには gcc -o app app.o lib01.a lib02.a のように指定する必要があります. 逆に gcc -o app app.o lib02.a lib01.a とすると, 「lib01.a で使っているシンボルが定義されていない」というエラーが出ると思います. lib01.a と lib02.a が互いに相手の関数を使っていることもありえますが, この場合には gcc -o app app.o lib01.a lib02.a lib01.a のように同じライブラリを 2回 (以上) 指定することになります. まあ, こんな構成になっているライブラリに問題があるわけですが. 「Linkers & Loaders」って本があるので, そいつを参考にしてもいいかも. あ, そういえば -lib01.a だと libib01.a.a を探しそうな気もします.
- yama06
- ベストアンサー率61% (101/164)
ar x lib01.a で全部取り出せるのではないでしょうか。 tでリストも取り出せますし、つまりtarとほとんど同じかと。
お礼
回答ありがとうございます。 試してみたいと思いますが、これって結構頻繁にあり得るやり方でしょうか?そもそもこのようなライブラリ構成がおかしいとの指摘もありますが・・・。
- Tacosan
- ベストアンサー率23% (3656/15482)
そもそもそ~いうことをしようとする意味がわからんのですが.... 最後にリンクするときに, 複数のライブラリを並べればいいだけじゃないの?
お礼
回答ありがとうございま。 Lib01.libの中でもLib02.libの関数を使用していて、 exeファイルを作成するときに両方リンクするようにも試しましたが、Lib01.libで"undefine reference"のエラーが発生しました。 これは私の何かのミスでしょうか?理論上できるはずでしょうか?
- yama06
- ベストアンサー率61% (101/164)
ar x でlib01.aやlib02.aからオブジェクトファイルを取り出して、 再びarで再結合するのではだめなのでしょうか?
お礼
回答ありがとうございます。 …となると取り出すオブジェクトファイルが指定できなくてはならないのでしょうかね?? ちょっと調べてみたいと思います。
お礼
回答ありがとうございます。 なるほど順番にも気をつけなければならないですね。 実際はもっと多くのライブラリを使用しており複雑になっているので、見直してみたいと思います。 > -lib01.a だと libib01.a.a を探しそうな気もします. 記述ミスでした(笑)