0

C++ のプログラムで libzip を使用して、zip アーカイブからファイルを抽出したいと考えています。まず、ファイルの数を取得し、それらの名前を取得して読み取ります。ファイルの数を取得するには、「zip_get_num_entries」を使用します。そのプロトタイプは次のとおりです。

zip_uint64_t zip_get_num_entries(struct zip *, int)

そして、私がこの関数を使用する方法:

int nbrEntries(0);
zip *archive = zip_open("myZip.zip", 0, 0);
nbrEntries = zip_get_num_entries(archive, 0);

このコードを書いたとき、Code::Blocks が zip_get_num_entries を提案してくれたので、ヘッダーの問題はありません。しかし、コンパイルすると、コンパイラ (MinGW) から次のように言われました。

undefined reference to `_imp__zip_get_num_entries'

そこで、廃止された同等の zip_get_num_files を試してみましたが、うまくいきました。CMake で作成したプロジェクト libzip.dll.a にインクルードしました。libzip.dll と libzip.dll.a の 2 つのファイルがありました。

ライブラリの問題だと確信しています (MacOS ではこの問題は発生していないことに注意してください) が、これを解決する方法がわかりません。ありがとうございました!

編集:私は彼らのウェブサイトを検索し、zip_get_num_files の実装は、ウェブサイトで利用可能なライブラリをリリースしたときに新しいものであると読みました。そのため、Mercurial リポジトリを検索したところ、2 日前にリリースされたバージョンが見つかりました (Web サイトでのリリースよりも少し新しいもので、ほぼ 1 年が経過しています)。CMakeでビルドしたらうまくいきました!

4

2 に答える 2

0

ついに zip_get_num_entries の使用に成功しました! 彼らのウェブサイトを検索したところ、ウェブサイトで利用可能なライブラリをリリースしたときに zip_get_num_files の実装が新しくなったことがわかりました。そのため、Mercurial リポジトリを検索したところ、2 日前にリリースされたバージョンが見つかりました (Web サイトでのリリースよりも少し新しいもので、ほぼ 1 年が経過しています)。CMakeでビルドしたらうまくいきました!

于 2013-02-22T12:33:51.363 に答える
0

「未定義の参照」は、利用可能な関数の定義/実装 (宣言/プロトタイプとは対照的に) がないことを意味します。ライブラリをリンクするのを忘れました。で MinGW を使用するため、コマンド ラインで、または の一部として実行するg++必要があります。-lzipLDFLAGS

何かを誤って構成した可能性もあります。その場合、定義によってシンボル名が異なる場合があります。しかし、最も可能性の高いケースは、依存関係をリンクするのを忘れたことです。

于 2013-02-22T11:50:57.970 に答える