7

私は自分のプロジェクトでlibarchiveをしばらく使用してきましたが、うまく機能しています。現在、動的にリンクしているため、Windowsではlibarchive.dllファイルがシステムに存在する必要があります。ライブラリに静的にリンクしたいので、わざわざ DLL を配布する必要はありませんが、これを達成するのに本当に苦労しています!

現在、私のmakeファイルには次のようなものがあります: -Lpath/to//libarchive/ -larchive

これは機能しますが、動的リンクを行います。静的リンクを強制する方法がわかりません。

libarchive ディレクトリに libarchive.dll.a と libarchive_static.a の 2 つのファイルがあることがわかります。libarchive_static.a にリンクしたいのですが、これを指定できないようです。メイク ファイルで -larchive_static を実行すると、リンカー エラーが発生します。

Windows の静的ライブラリは lib ファイルであるという印象を受けましたが、libarchive をビルドすると、そのようなファイル タイプは得られません。

libarchive から .lib ファイルを作成するにはどうすればよいですか。また、追加の質問として、 aファイルとlibファイルの違いは何ですか?

アップデート

libarchive に静的にリンクするには、make のライブラリ コマンドに以下を含める必要があります。

-Lpath/to//libarchive/ -larchive_static

これは libarchive_static.a ファイルにリンクします。ただし、コードで LIBARCHIVE_STATIC も定義する必要があります。

ここでの問題は、libarchive が bzip2 ライブラリ (および他のライブラリ) に依存していることです。それらの静的ビルドがない場合、次のようなリンカー エラーが発生します。

`BZ2_bzCompressInit' への未定義の参照

libarchive コマンドのに、依存ライブラリの静的ビルドとリンカーへの同様のコマンドが必要です。

-Lpath/to/bzip2/ -lbzip2

ソースから bzip2 をビルドするか、簡単な方法でビルド済みのバイナリを Gnu32Win プロジェクトから入手できます: http://gnuwin32.sourceforge.net/packages.html

4

1 に答える 1

3

libarchive_static.aリンク コマンドに明示的に追加するだけです。

gcc -o YourApp.exe $(OBJS) path/to/libarchive_static.a $(OtherLibs)

「.lib」ファイルはコンパイラ (Borland、Microsoft など) によって異なります。「.a」は UNIX のarツールの古い「アーカイブ」形式です。現在は、静的ライブラリのバンドルにのみ使用されています。

現在、私のmakeファイルには何かがあります...そしてこれは機能しますが、動的リンクを行います

.a ファイルには実際には、libarchive 自体ではなく、.dll ファイルへの動的リンク用のコードが含まれています。起動時に関数へのポインタが割り当てられ、動的リンクが行われます。

于 2012-07-26T10:40:04.430 に答える