初めて質問させていただきます。
複数の静的リンクライブラリをまとめて、
一つの静的リンクライブラリを作成できずに困っています。
以下の様な構造のディレクトリがあります。
MAINDIR
├SUBDIR_A
├SUBDIR_B
└SUBDIR_C
まず、それぞれのサブディレクトリ(SUBDIR_A, SUBDIR_B, SUBDIR_C)
で、個別に静的ライブラリ(SUB_A.a, SUB_B.a, SUB_C.a)を
作成しました。コマンドはgccでコンパイル後に"ar rv" です。
最後にMAINDIRで、各サブディレクトリで作った静的ライブラリ
(SUB_A.a, SUB_B.a, SUB_C.a)から一つの静的ライブラリ(MAINLIB.a)
を以下のコマンドで作りました。
ar rv MAINLIB.a SUB_A.a, SUB_B.a, SUB_C.a
しかし、作成したMAINLIB.aから実行ファイルを作ろうとすると、
"ould not read symbols: Archive has no index; run ranlib to add"
というエラーメッセージが出て失敗しました。
複数の静的ライブラリをまとめた一つの共有ライブラリを作れたので、
複数静的ライブラリ→1つの静的ライブラリも作れると思ったのですが。。。
御存知の方がいらっしゃいましたら、お助けください。お願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
これでどうでしょうか?
% cd MAINDIR
% ( cd SUBDIR_A; ar cr libSUB_A.a *.o; ranlib libSUB_A.a )
% ( cd SUBDIR_B; ar cr libSUB_B.a *.o; ranlib libSUB_B.a )
% ( cd SUBDIR_B; ar cr libSUB_C.a *.o; ranlib libSUB_C.a )
で、これらを1つにまとめるためには、libSUB_A.a、libSUB_B.a、libSUB_C.a をいったん展開しないとだめです。
% mkdir work
% cd work
% ar x ../SUBDIR_A/libSUB_A.a
% ar x ../SUBDIR_B/libSUB_B.a
% ar x ../SUBDIR_C/libSUB_C.a
% ar c ../libMAIN.a *.o; ranlib ../libMAIN.a
% cd ..
% rm -rf work
ただ、複数の静的ライブラリをまとめるようなことはあまりしないと思いますが・・・。
> しかし、作成したMAINLIB.aから実行ファイルを作ろうとすると、
> "ould not read symbols: Archive has no index; run ranlib to add"
> というエラーメッセージが出て失敗しました。
メッセージのとおり ranlib を実行すれば解決するでしょう。
> これは、私のケアレスミスでした。実行ファイル作成時のライブラリのリンク順の問題でした。
> #なぜ、ar実施版だけリックエラーが??という疑問がありますが。。。
共有ライブラリの場合はリンク時に指定する順番を問いませんが、静的ライブラリの場合は順番が重要になります。例えば、libintl は libiconv に依存しますが、どちらも静的ライブラリしかない場合、
○ gcc test.c -lintl -liconv
× gcc test.c -liconv -lintl
となります。(共有ライブラリの場合はどちらでもOK)
> #ld -r -o MAINLIB.o --whole-archive libSUB_A.a libSUB_B.a... --no-whole-archive
> #ar rv libMAINLIB.a MAINLIB.o
> で libMAINLIB.aを作成してみましたが、これだと
> 実行ファイル生成時に、libMAINLIB.a内の関数について"undefined reference"のリンクエラーがでました。
file コマンドや nm コマンドも活用してみてください。
ld -r で作成されたファイルがオブジェクト・ファイルなのか、静的ライブラリなのかは file コマンドで確認できるでしょう。
シンボルが解決できているかは nm コマンドで確認できるでしょう。
参考URL:http://www.linux.or.jp/JM/html/GNU_binutils/man1 …
ご丁寧な回答に感謝します。
お返事遅くなり申し訳ありません。
> これらを1つにまとめるためには、libSUB_A.a、libSUB_B.a、
> libSUB_C.a をいったん展開しないとだめです。
やはり、いったい展開しないとだめなんですね。。。。
> メッセージのとおり ranlib を実行すれば解決するでしょう。
実は、ranlibを行ってもerrorがでてしまうのです。
MAINLIB.aの中身が*.oではなく*.aなので読めないみたいです。
nmコマンドでも、シンボルを読めません。。。
> file コマンドや nm コマンドも活用してみてください。
> ld -r で作成されたファイルがオブジェクト・ファイルなのか、静的> ライブラリなのかは file コマンドで確認できるでしょう。
> シンボルが解決できているかは nm コマンドで確認できるでしょう。
fileコマンドですか!なるほど、ちょっとしらべてみます。ありがとうございます。
No.3
- 回答日時:
え~と....
すみません, 期待にそえるとは全く思っていないのですが, とりあえずお約束の質問を 1つ:
環境 (OS, ar, ld などのバージョン) は?
いや, ld でスタティックライブラリを作れる環境がちょっと想像できないので....
この回答への補足
バージョンを確認しましたので、追記させていただきます。
ar: 2.13.90.0.18 20030206
ld: 2.13.90.0.18 20030206
OS: Linux(Fedora Core 6)
でした。
回答ありがとうございます。
返事がおそくなり申し訳ありません。
すいません。職場の環境ですので、
月曜日にまた追記させていただきます。
ちなみにOSはLinuxです。
ディストリビューションはFedora Core 6です。
No.2
- 回答日時:
> arの中では結局ld が走るという事は知りませんでした。
いえ,ar の中で ld が走るんじゃなくて,リンク時に ld が
使用する静的ライブラリが ar 形式なので,ar の中身は ld が
読める *.o ファイルでなければならないということです.
> MAINLIB.a SUB_A.a, SUB_B.a, SUB_C.a
それから,静的ライブラリ XXX の名前は libXXX.a にするのが
慣例です.この形式の名前にしておくと,例えばコンパイル・
オプション -lXXX でライブラリ指定が可能です.
(ライブラリ・ディレクトリの指定が別途必要.)
例:gcc src.c -lXXX …
この回答への補足
下の「ANo.2 回答のお礼」で間違いがありましたので訂正します。
> 実行ファイル生成時に、libMAINLIB.a内の関数について"undefined reference"のリンクエラーがでました。
これは、私のケアレスミスでした。実行ファイル作成時のライブラリのリンク順の問題でした。
#なぜ、ar実施版だけリックエラーが??という疑問がありますが。。。
双方とも、実行ファイルは作成できて動作するようです。
ファイルサイズは違うので前者と後者版のlibMAINLIB.aは、別物なのでしょうが。。。
ご指摘感謝します。
理解が間違っておりました。
ちょっと実験してみたのですが、以下の様にすると
複数の静的ライブラリから1つのライブラリを作れるようです。
#ld -r -o MAINLIB.a --whole-archive SUB_A.a SUB_B.a... --no-whole-archive
#ライブラリ名の付け方のご指摘を反映させると
#ld -r -o libMAINLIB.a --whole-archive libSUB_A.a libSUB_B.a... --no-whole-archive ですね。
"-r"引数は「ldの入力として指定できる形式で出力する。」
"--whole-archive"引数は「以降に指定する書庫内の*.oをリンクする」
"--no-whole-archive"引数は「以降"--whole-archive"を無効にする」
です。
上記の様に生成したlibMAINLIB.aで実行ファイルが動く事は確認できました。
ただ、1つ気になる点が、
上記で作成したlibMAINLIB.aは静的ライブラリっぽい名前をつけた
オブジェクトの塊だけど、書庫ファイルとは別物では?と思い。
#ld -r -o MAINLIB.o --whole-archive libSUB_A.a libSUB_B.a... --no-whole-archive
#ar rv libMAINLIB.a MAINLIB.o
で libMAINLIB.aを作成してみましたが、これだと
実行ファイル生成時に、libMAINLIB.a内の関数について"undefined reference"のリンクエラーがでました。
ご意見をいただければ、助かります。
No.1
- 回答日時:
ar は汎用のアーカイバじゃないのでどんなファイルでも入れられる
わけではありません.いや,入れるだけならできますが,結局
その中身は ld が使うわけだから,その入力となりうるファイル
(事実上 *.o) じゃないと意味がありません.
/usr/lib あたりにたくさん *.a ファイルがあるので,ar tv libXXX.a で
覗いてみればわかると思いますが,*.o ファイルしか入っていないはずです.
> 各サブディレクトリで作った静的ライブラリ
> (SUB_A.a, SUB_B.a, SUB_C.a)から一つの静的ライブラリ(MAINLIB.a)
> を以下のコマンドで作りました。
> ar rv MAINLIB.a SUB_A.a, SUB_B.a, SUB_C.a
SUB_[ABC].a からすべての *.o を取り出して MAINLIB.a に入れなきゃ.
ar xv SUB_A.a
ar xv SUB_B.a
ar xv SUB_C.a
ar rv MAINLIB.a *.o
ranlib MAINLIB.a # 不要かもしれない.
ar のマニュアル
http://www.linux.or.jp/JM/html/GNU_binutils/man1 …
ranlib のマニュアル
http://www.linux.or.jp/JM/html/GNU_binutils/man1 …
ld のマニュアル
http://www.linux.or.jp/JM/html/GNU_binutils/man1 …
ご教授ありがとうございます。
arの中では結局ld が走るという事は知りませんでした。
この情報を知ることができてよかったです。
確かに*.o以外じゃldの入力になりませんね。納得です。
この観点でもう少し、ar, ldを勉強してみたいと思います。
助かりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
スタティックリンクライブラリで2重リンクできる?
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Google ColaboでGUI作成
-
Windows Media Playerを開くと...
-
アクセスバージョンの違い。
-
python urlopen error について...
-
iCloudフォトライブラリ内の画...
-
プログラミング言語のAPI
-
本格的なGUIを作るのにおすすめ...
-
マウスのクリックを自動で
-
C言語のライブラリ関数の勉強の...
-
sleep関数
-
システムコールと標準ライブラ...
-
declaration of 'index' shadow...
-
三目並べを作っているのですがD...
-
Windows上でJavaかc言語を使い...
-
C言語/画像処理をしたいです/ex...
-
Dreamweaverのライブラリが反映...
-
姿勢センサでプロジェクタの台...
-
VB.NET とドットNET(.NET...
-
HTML CSSの勉強のポートフォリ...
-
月額15,000円のプログラミング...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Google ColaboでGUI作成
-
Windows Media Playerを開くと...
-
iCloudフォトライブラリ内の画...
-
python urlopen error について...
-
本格的なGUIを作るのにおすすめ...
-
三目並べを作っているのですがD...
-
マウスのクリックを自動で
-
unix-c と linux-c の違いは?
-
Ps+のフリープレイでDestiny2の...
-
boostのアンインストールについて
-
(C言語等で)既存ファイル群の属...
-
LIBCMT.LIBをリンクしてコンパ...
-
オンラインゲームを作る道のり...
-
DirectX Graphics と OpenGLっ...
-
プログラマーで「使えない人」...
-
ライブラリ作成時のグローバル...
-
gcc に mktemp 危険と怒られ...
-
モバイルCというC言語のプログ...
-
cでなぜguiアプリが作成出来る...
-
outp関数について
おすすめ情報