2

zipアーカイブから1つのファイルを抽出するアプリケーションを作成する必要があります。その後、Android用にコンパイルします。

libzip-0.10.1がプリインストールされたUbuntuを使用しています。EclipseでCプロジェクトを作成し、インクルードパスを追加して、ファイルを抽出するための簡単なスクリプトを見つけました。残念ながら、私は以下を構築することができず、いくつかのアドバイスを使用することができます。

// zip.c file
#include <stdio.h>
#include <stdlib.h>
#include <zip.h>

int main(int argc, char **argv) {
struct zip *zip_file;
struct zip_file *file_in_zip;
int err;
int files_total;
int file_number;
int r;
char buffer[10000];

if (argc < 3) {
    fprintf(stderr,"usage: %s <zipfile> <fileindex>\n",argv[0]);
    return -1;
};

zip_file = zip_open(argv[1], 0, &err);
if (!zip_file) {
    fprintf(stderr,"Error: can't open file %s\n",argv[1]);
    return -1;
};

file_number = atoi(argv[2]);
files_total = zip_get_num_files(zip_file);
if (file_number > files_total) {
    printf("Error: we have only %d files in ZIP\n",files_total);
    return -1;
};

file_in_zip = zip_fopen_index(zip_file, file_number, 0);
if (file_in_zip) {
    while ( (r = zip_fread(file_in_zip, buffer, sizeof(buffer))) > 0) {
        printf("%s",buffer);
    };
    zip_fclose(file_in_zip);
} else {
    fprintf(stderr,"Error: can't open file %d in zip\n",file_number);
};

zip_close(zip_file);

return 0;
};

また、プロジェクトにディレクトリを含めるためにいくつかの.hファイルを追加し、zip.cファイルを使用してディレクトリにいくつかの.cファイルを追加しました。その後、すべての依存関係は良好でしたが、エラーがあります。

‘struct zip’ has no member named ‘default_password’ in file zip_fopen_index.c

ファイルzip_fopen_index.cは次のとおりです。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

#include "zipint.h"


ZIP_EXTERN struct zip_file *
zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags)
{
    return zip_fopen_index_encrypted(za, fileno, flags, za->default_password); // error here
}
4

1 に答える 1

3

まず第一に、私にいくつかのコメントを許可します:

プログラムはEclipseによってコンパイルおよびリンクされていません。

コンパイルはコンパイラによって行われます(gccオプションを使用-c):

make all 
Building file: ../zip.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"zip.d" -MT"zip.d" -o "zip.o" "../zip.c"
Finished building: ../zip.c

リンクはリンカによって行われます(オプションを使用してコンパイラを介して-o):

Invoking: GCC C Linker
gcc  -o "unzipper"  ./zip.o   
./main.o: In function `zip':
/home/alk/workspace/unzipper/Debug/../zip.c:20: undefined reference to `zip_open'
/home/alk/workspace/unzipper/Debug/../zip.c:27: undefined reference to `zip_get_num_files'
/home/alk/workspace/unzipper/Debug/../zip.c:33: undefined reference to `zip_fopen_index'
/home/alk/workspace/unzipper/Debug/../zip.c:35: undefined reference to `zip_fread'
/home/alk/workspace/unzipper/Debug/../zip.c:38: undefined reference to `zip_fclose'
/home/alk/workspace/unzipper/Debug/../zip.c:43: undefined reference to `zip_close'
collect2: ld returned 1 exit status

Eclipseは、すべてのソースとその参照を管理し、コンパイラーとリンカーのタスクを生成し、それらのオプションを設定するのに役立つフレームワークを提供します。

undefined referenceリンカがプログラムのビルド中に関数のどこにあるかを教えてくれたとき、これの原因は、それらの関数がzip_*どこにあるかをリンカに(コンパイラを介して、Eclipseを介して)伝えることができなかったためです。zip_*

これらのzip_*関数はライブラリ、つまり。にありますlibzip

したがって、プログラマーがリンカーに(コンパイラーを介して、Eclipseを介して)伝える必要があるのは、コンパイラーがソースからコンパイルしたものに対してこれらの関数をリンクすることです。

その結果、リンカは、コンパイルされたソースから、必要なすべてのライブラリとともに実行可能なプログラムを作成できます。特定のライブラリは、デフォルトでEclipse(およびリンカ)に認識されています。たとえば、C標準関数を含むライブラリ、つまりlibc

物事を進めるために:

libzip1ライブラリのソースからプルしたソースファイルをプロジェクトから削除します。これらのソースは、プロジェクトで使用するライブラリにコンパイルされていlibzipます。

2(Eclipseを介して)リンカーlibzipにプロジェクトで使用するように指示します。

以下の手順に従ってください。

プロジェクトのプロパティを開きます

「C/C++一般」をクリックします

[パスとシンボル]をクリックし、左側にある[ライブラリ]タブを選択し、[追加]をクリックして次のように入力します。zip

最後に「OK」をクリックします

3次に、プログラムを作成してみます。

Building target: unzipper
Invoking: GCC C Linker
gcc  -o "unzipper"  ./zip.o   -lzip
Finished building target: unzipper

(追加オプションに注意してください-lzip!)

'libzip'の開発バージョンが以前に正しくインストールされていれば、問題はありません。


PS:unzipper例を作成するためにEclispeプロジェクトに使用した名前でした。

PSS:EclipseJunoSR1を使用しました

于 2012-10-18T07:02:00.090 に答える