私は何かを静的にコンパイルしようとしており、これらすべての依存関係が何であるかを把握しようとしています。 .dllファイルは、最終出力に必要となる動的にリンクされた依存関係のためのものであることを知っていますが、.aおよび.libファイルとは何ですか。また、それらのそれぞれがいつ必要ですか。
.aはコードのアーカイブです。コンパイルされていますが、リンクされていません。プログラムの最終リンク手順で静的にリンクします。
.libは.aと同じか、魔法のいわゆる「インポートライブラリ」:実行時に.dllを必要とする薄いプレースホルダーです。
Unixシステムでは、.a
ファイルがあります。これらは、オブジェクトファイル(.o
)の単純なアーカイブです。
Windowsには.lib
ファイルがありますが、これはまったく同じものですが、UnixではなくWindows用です。
さらに微妙な点は、コードをDLL(Windows))にリンクするには、DLLを呼び出す単純なラッパーを含む.lib
ファイルにリンクする必要があることです。 Unixシステムでは、伝統的に、そのようなラッパーは必要ありません(リンカーはその場で生成できるほどスマートです)。
ここで言及されていないのは、少なくとも時々、.aファイルと.libファイルが実際には同じバイナリ形式であるという驚くべき事実です。 mingwのWebサイトにはあまり言及していませんが、MS Visual C++の64ビットコンパイラーcl.exeを取得して、mingw-w64 g ++コンパイラーを使用して生成された.dllファイルにリンクしようとすると、コマンドラインを受け入れました
cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a
対応する.dllファイルのコピーを現在のディレクトリに配置するとすぐに、結果の.exeファイルが正しく実行されました。 (「コマンドライン警告D9024:認識されないソースファイルタイプ 'path\to\lib\gmp-6.0.0\lib\libgmp.dll.a'、オブジェクトファイルが想定されています」という警告をつぶやきました。)
さらなる証拠は、Linux file
コマンドが、私が試した各拡張子(.libまたは.a)のいくつかのファイルについて「current ar archive」を報告したことです。
通常、。aはLinuxの静的ライブラリ用であるのに対し、。libはWindows用の同じライブラリ用です。しかし、もちろんそれは単なる慣習です。