web-dev-qa-db-ja.com

静的ライブラリとアーカイブライブラリの違いは何ですか?

最近の回答 のコメントで、静的ライブラリをコンパイル済みオブジェクトファイルのアーカイブと同等に扱いました。

回答は同じではないので、違いは何ですか?

明確にするために、gccは Ar_(Unix)#Example_usage のように、オブジェクトファイルのアーカイブをライブラリとして受け入れます。これは、他の形式のスタティックライブラリ(存在する場合)とどのように異なりますか?これらの異なるライブラリタイプを使用することにはどのような利点または欠点がありますか?

具体的な主張は、静的ライブラリとリンクする代わりに、ソースファイルを直接コンパイルすることでした。

特にリンク時間の最適化をオンにすると、コードがより高速で優れたものになります。

そして

-fltoでコンパイルされた.oファイルのアーカイブを作成できますが、それらは実際には静的ライブラリではありません

ただし、他の違いがある場合は、それらに対処する回答を歓迎します。

3
Baldrickk

静的ライブラリは、オブジェクトファイルのarアーカイブ(Zipと同様に古くなっています)です。オブジェクトファイルは、マシンコードにコンパイルされているが、まだリンクされていないソースコードです。次のような静的ライブラリを作成できます(Linux/OSX):

# Create a source file containing the single function in our library.
echo "int answer() { return 42; }" > answer.cpp
# Compile it to machine code.
c++ -c answer.cpp -o answer.o
# Compress it into an ar archive.
ar -r libanswer.a answer.o

それでおしまい。 ar形式は、静的ライブラリに固有のものではありません。必要に応じて、Zipのように使用できます(ただし、古くてゴミがあるため、だれも使用しません)。また、ライブラリのすべてのシンボルにインデックスを追加することで、リンク時のパフォーマンスを向上させることができます。このような:

ar -rs libanswer.a answer.o

疑問に思ったことがあるなら、ranlibはこれで全部です。

とにかく-リンク時最適化のポイントは、マシンコードにコンパイルしないという意味で、「実際の」オブジェクトファイルを作成しないことです。見てください:

$ c++ -c answer.cpp -o answer.o
$ c++ -c answer.cpp -flto -o answer_lto.o
$ file answer.o
answer.o: Mach-O 64-bit object x86_64
$ file answer_lto.o
answer_lto.o: LLVM bitcode, wrapper x86_64

answer.oはネイティブのMach-Oオブジェクトファイルです(Macを使用しているため、LinuxではELFになります)。だが answer_lto.o ではありません!それはLLVMビットコードです。それはマシンコードにコンパイルされていません。

必要に応じて、これをarアーカイブに配置できます。

ar -r libanswer_lto.a answer_lto.o

ただし、これは実際の静的ライブラリではなく、Clang以外のツールでリンクすることはできません。 GCCはlibanswer.aではなくlibanswer_lto.a

私はあなたを推測するできた呼び出しlibanswer_lto.a必要に応じて「静的ライブラリ」(定義は変更される可能性があります)、「ここに静的ライブラリがあります」と言ってそれらを指定した場合libanswer_lto.aほとんどの人は、「何だ、そうじゃない」と言います。

私はそれをLLVMビットコードライブラリなどと呼びます。

4
Timmmm

どちらも同じで、どちらもarによって作成されています。

オブジェクトファイルのアーカイブ(ar rc $object_filesまたは類似のものによって作成されたもの)は、静的ライブラリの他の形式(私が知る限り、存在しないもの)と同等です。

請求

静的ライブラリとリンクする代わりに、ソースファイルを直接コンパイルすると、コードがより高速で優れたものになる

真実ではない。静的アーカイブからのリンクとソース/オブジェクトファイルへの直接リンクの全体的な影響はありません。実際、オブジェクトファイルを直接リンクすると、実行可能ファイルのサイズが大幅に増加する可能性があります。

請求

-fltoでコンパイルされた.oファイルのアーカイブを作成できますが、それらは実際には静的ライブラリではありません

必ずしもそうではありません。これらのオブジェクトファイルは、任意のプログラムまたは共有ライブラリにリンクされたときに機能するはずであり、それらが通常のオブジェクトファイルであるかLTOオブジェクトであるかについては明らかではありません。

1
user332348