同じ名前のオブジェクトファイルを持つ静的ライブラリ(AR)
-
29-10-2019 - |
質問
少しコンテキスト。ソースファイルがあるとしましょう。ソースファイルは、静的ライブラリで終わる必要があります。 2つのCPPファイルがあるとしましょう a.cpp
と a.cpp
2つの異なるサブディレクトリにあります。このようなもの:
foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp
彼らのコンテンツは衝突しておらず、完全に異なっています。ファイル名は同じです。
さて、コンパイルするとき、私は2つになります a.o
もちろんファイル。
gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o
今すぐ静的libを作成した場合
ar rcs libfoobar.a foo/a.o bar/a.o
静的ライブラリ内の両方のファイルが実行されているのを見ることができます nm libfoobar.a
. 。元気そうです。
問題
私が見ることができる問題は、私が実行した場合です ar
個別にコマンド foo/a.o
と bar/a.o
それらを同じ静的ライブラリに入れます。これで、後者のオブジェクトファイルが前者を上書きするので、実行するときに nm libfoobar.a
ライブラリに後者のオブジェクトが表示されます。同じオブジェクトファイル名のためにこれが当てはまると思います。
で静的ライブラリを作成するとき ar
, 、私は常にすべてのオブジェクトを一度に結合する必要がありますか、それとも実行するのも問題ありませんか ar
一度にオブジェクトの一部を複数回収集して、すべて同じ静的ライブラリに入っていますか?この例では、前者の作品を見ることができますが、後者は見ることができません。
物事はどのように機能しますか a.cpp
変更と静的ライブラリは変更する必要がありますか?意思 ar
権利を見つけてください a.cpp
図書館で変更するには?
これはほんの小さな例ですが、多くのファイルを備えた大規模なプロジェクトを考えてみてください。一部は同じ名前を持っています。 1つのライブラリを作成したい場合は、この状況にもなる可能性があります。
一般的に、これは、図書館の構成方法、ファイルの名前がどのように名前が付けられているか、または物事を機能させるために他の何かがあるかという貧弱な組織ですか?
解決
あなたは考えなければなりません ar
非常に古いファイルアーキバーとして。ディレクトリのアーカイブについては何も知りません。 (ARアーカイブはフラットです)
(Man AR): ar - create, modify, and extract from archives
Man AR、オプション r
:
rファイルメンバーを挿入...アーカイブに(交換用)。この操作は、以前に既存のメンバーが削除される場合、Qとは異なります 彼らの名前は追加されているものと一致します.
実行してみてください ar t libfoobar.a
そして、あなたは見るだけです a.o
ファイルのため ar
アーカイブにディレクトリ名を保存しませんでした。
したがって、ARアーカイブにパットされたすべてのオブジェクトファイルを異なる方法で名前にする必要があります(UPD) ARを使用してライブラリでいくつかのオブジェクトファイルの更新を実行したい場合
ar rcs lib.a foo/a.o bar/a.o
Lib.AにあるAOの交換はありますが、追加されたファイルが名前の衝突を確認しません。
その他のケース: ar rcs lib.a foo/a.o
と ar rcs lib.a bar/a.o
アーカイブに最初のAOを保存し、次に2番目に保存します ar
古い人を見つけるでしょう a.o
アーカイブで、古いファイルを置き換えます。
他のヒント
ライブラリは、ライブラリ内のオブジェクトファイルによってたまたまグループ化された機能および/またはデータの単なるコレクションであり、それらのオブジェクトファイルには名前があります。これらの名前は、それを更新 /抽出 /削除する以外の役割を果たしません。
したがって、2つ以上のオブジェクトファイルに対して2つの同一の名前を持つことは完全に合法です。ライブラリを更新するとき、司書は最初のオブジェクトを交換している名前に置き換え、それ以上見ません。
しかし、それは賢明なことではありません。
私はあなたの質問の一部しか対処できません。 MakeFileの構文から、以前は通常の方法であったことがわかります - 1つのオブジェクトのみを更新します。しかし、たとえば、Automakeのアプローチは、1つのファイルが変更されていても、ライブラリをゼロから再構築することです。今は大きな問題を引き起こしていません...
申し訳ありませんが、今すぐUNIXがないので、専門家が答えるのを待ちます:)
私自身の経験から、静的ライブラリに同じ名前の2つのファイルを持つことはお勧めしません。