0

スタティック ライブラリを作成したいのですが、yolinux チュートリアル http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.htmlに従って適切に作成できました。

この問題は、新しい静的ライブラリを作成するために静的ライブラリを含めたいときに発生します。シナリオは次のとおりです。

gcc -Wall -c cdbSearch.c
ar -cvq cdbSrc.a cdbSearch.o cdb.a

これにより、cdbSrc.a という名前のスタティック ライブラリが正常に作成されます。

しかし、これをテストプログラムとリンクしようとすると

gcc -o cdbtest cdbtest.c cdbSrc.a
cdbSrc.a(cdbSearch.o): In function `cdb_search':
cdbSearch.c:(.text+0xa2): undefined reference to `cdb_seek'
collect2: ld returned 1 exit status

実際にはcdb.aの一部であるcdb_seekを参照できないというエラーが表示されます

テストプログラムをcdb.aでコンパイルすると、正常に動作しますが、目的を果たしません..

gcc -o cdbtest cdbtest.c cdbSrc.a cdb.a

バイナリが cdbtest に正常に作成されます。

これは意図された動作ですか?はい、なぜですか?? そうでない場合、私は何が間違っているのですか..

4

3 に答える 3

3

はい。これは意図された動作です。バイナリを形成するには、すべての静的ライブラリをリンクする必要があります。共有ライブラリとは異なり、静的ライブラリは他のライブラリへのリンクを保持しません。

于 2012-08-03T05:10:52.530 に答える
1

静的ライブラリは、オブジェクトファイルの単なるアーカイブです。を使用してcdb.aを解凍する必要がありますar x

その後、解凍されたすべてのオブジェクトとcdbSearch.oをcdbSrc.aにパックします。

于 2012-08-03T05:11:41.830 に答える
1

cdbSearch.oすべてのオブジェクト ファイルを含む新しいスタティック ライブラリを作成したいとしますcdb.a

cdb.afirst.o、 とsecond.o.

arオブジェクト ファイルを既存のスタティック ライブラリに追加できます。そのために以下のコマンドを実行できます。

ar r cdb.a cdbSearch.o

という名前のライブラリが存在cdb.aする場合、上記のコマンドは新しいオブジェクト ファイルcdbSearch.oをそこに追加します。または、cdb.a1 つのオブジェクト ファイル ( ) のみを含む新しいスタティック ライブラリを作成しますcdbSearch.o

cdb.aには 3 つのオブジェクト ファイル ( first.osecond.oおよび) が含まれますcdbSearch.o。必要に応じて、静的ライブラリ ファイル名を変更できるようになりましたmv cdb.a cdbSrc.a

オプションを使用して、静的ライブラリから既存のオブジェクト ファイルを削除することもdできます。たとえば、オブジェクト ファイルを削除する場合second.ocdbSrc.a、次のコマンドを実行できます。

ar d cdbSrc.a second.o

tオプションを使用して、静的ライブラリのオブジェクト ファイルを一覧表示します。

ar t cdbSrc.a

于 2012-08-03T09:42:15.337 に答える