14

ビットコンテキスト。ソースファイルがあり、静的ライブラリに保存する必要があるとします。2つのcppファイルがa.cppありa.cpp、2つの異なるサブディレクトリにあるとします。このようなもの:

foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp

それらの内容は衝突しておらず、完全に異なります。ファイル名はまったく同じです。

さて、コンパイルするとa.o、もちろん2つのファイルになります。

gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o

今静的ライブラリを作成すると

ar rcs libfoobar.a foo/a.o bar/a.o

を実行している静的ライブラリ内の両方のファイルを見ることができますnm libfoobar.a。うまくいくようです。

問題

私が見ることができる問題は、arコマンドを個別に実行しfoo/a.obar/a.oそれらを同じ静的ライブラリに配置するかどうかです。これで、後者のオブジェクトファイルが前者を上書きするため、実行するnm libfoobar.aと、ライブラリに後者のオブジェクトが表示されます。同じオブジェクトファイル名が原因だと思います。

を使用して静的ライブラリを作成する場合、ar常にすべてのオブジェクトを一度に組み合わせる必要がありますか、それともar、オブジェクトの一部を一度に収集して複数回実行しても、すべて同じ静的ライブラリになりますか?この例では、前者の作品を見ることができますが、後者は見ることができません。

a.cpp1つが変更され、静的ライブラリを変更する必要がある場合、どのように機能しますか?図書館で変更arする権利を見つけますか?a.cpp

これはほんの小さな例ですが、多くのファイルがあり、いくつかは同じ名前の大きなプロジェクトを考えてみてください。ここで単一のライブラリを作成したい場合は、このような状況になる可能性もあります。

一般に、これはライブラリの構成方法、ファイルの名前付け方法、または物事を機能させるためにこれに何か他のものがあるかについての不十分な編成ですか?

4

4 に答える 4

7

arあなたは非常に古いファイルアーカイバとして考える必要があります。ディレクトリのアーカイブについても何も知りません。(arアーカイブはフラットです)

(man ar):ar - create, modify, and extract from archives

man ar、オプションr

rファイルメンバー...をアーカイブに挿入します(置換あり)。この操作は、名前が追加されているメンバーと一致する場合、既存のメンバーが削除されるという点でqとは異なります。

を実行してみてください。アーカイブにディレクトリ名が保存されていないため、ファイルar t libfoobar.aのみが表示されます。a.oar

したがって、arを使用してライブラリ内の一部のオブジェクトファイルを更新する場合は、arアーカイブに配置されたすべてのオブジェクトファイルに別の名前(UPD)を付ける必要があります。

ar rcs lib.a foo/a.o bar/a.olib.aで見つかったaoを置き換えますが、追加されたファイルの名前の衝突はチェックしません。

その他の場合:最初のaoar rcs lib.a foo/a.oar rcs lib.a bar/a.oアーカイブに保存し、次に2番目のaoをアーカイブ内でar古いものを見つけて、a.o古いファイルを置き換えます。

于 2011-02-05T14:56:24.320 に答える
3

ライブラリは、ライブラリ内のオブジェクトファイルによってたまたまグループ化された関数やデータのコレクションであり、それらのオブジェクトファイルには名前が付いています。これらの名前は、更新/抽出/削除以外の役割は果たしません。

したがって、2つ以上のオブジェクトファイルに2つの同一の名前を付けることは完全に合法です。ライブラリを更新するとき、ライブラリアンは最初のオブジェクトを置き換えている名前に置き換え、それ以上検索しません。

しかし、それは賢明なことではありません。

于 2011-02-05T14:14:07.980 に答える
1

私はあなたの質問の一部にしか答えることができません。Makefile構文から、これは通常の方法であることがわかります。つまり、1つのオブジェクトのみを更新します。ただし、たとえばautomakeのアプローチは、1つのファイルが変更された場合でも、ライブラリを最初から再構築することです。今は大きな問題にはなりません...

申し訳ありませんが、現在UNIXはありませんので、専門家の回答をお待ちしています:)

私自身の経験から、静的ライブラリに同じ名前の2つのファイルを置くことはお勧めしません。

于 2011-02-05T13:57:40.723 に答える
0

GNUarはこれを修正しました。マニュアルページはそれを非常によく説明しています:

$ man ar | sed -n '/^       P /,/^       \w/p' | head -n -1;
       P   Use the full path name when matching or storing names in the
           archive.  Archives created with full path names are not POSIX
           compliant, and thus may not work with tools other than up to date
           GNU tools.  Modifying such archives with GNU ar without using P
           will remove the full path names unless the archive is a thin
           archive.  Note that P may be useful when adding files to a thin
           archive since r without P ignores the path when choosing which
           element to replace.  Thus

                   ar rcST archive.a subdir/file1 subdir/file2 file1

           will result in the first "subdir/file1" being replaced with "file1"
           from the current directory.  Adding P will prevent this
           replacement.

于 2021-06-12T10:13:59.213 に答える