如何在不安装gnuWin32的情况下为libarchive增加zlib支持

来源:互联网 发布:视频一对一聊天软件 编辑:程序博客网 时间:2024/05/01 21:22

libarchive在windows下编译先要用cmake来生成vc的项目文件,cmake仅能找到gnuwin32中安装的zlib头文件和库文件。在不安装gnuwin32而又想加入zlib支持,可通过如下方法手工加入到项目文件中。

1. 先用cmake生成项目文件,cmake会提示找不到zlib库。

2. 下载zlib的源代码并用VC进行编译。

3. 将zlib.h 和 zconf.h 拷贝到 libarchive源代码目录,zlib.lib, zdll.lib拷贝到cmake生成的项目文件所在目录。

3. 用visual studio 打开cmake生成的libarchive项目文件,加入 HAVE_ZLIB_H宏定义,以及zlib.lib库连接,进行编译即可。

libarchive增加了zlib支持,可以将内存中的ZIP格式数据解压,如下为示例代码:

typedef struct {
  size_t size;
  char buf[0];
} curl_wbuf_t;

curl_wbuf_t *curl_wbuf;

int read_archive_data(struct archive *ar)
{
  int r;
  const char *buff;
  size_t size;
  la_int64_t offset;


  for (;;) {
    r = archive_read_data_block(ar, &buff, &size, &offset);
    if (r == ARCHIVE_EOF) {
      return (ARCHIVE_OK);
    }
    if (r != ARCHIVE_OK) {
      fprintf(stderr, "archive_read_data_block: %s, %d\n",
      archive_error_string(ar), r);
      return (r);
    }
    fprintf(stdout, "%s: buf=%lx,size=%x,offset=%x\n",
    __func__, (DWORD)buff, size, (DWORD)offset);
    // fprintf(stdout, ">>>>>>>>>>%.*s<<<<<<<<<<", size, buff);
  }
}
int uncompress_szselist(curl_wbuf_t *wbuf)
{
  struct archive_entry *entry;
  struct archive *a;
  int r;

  fprintf(stdout, "%s: buf size = %d\n", __func__, wbuf->size);
  a  = archive_read_new();
  archive_read_support_format_zip(a);
  r = archive_read_open_memory(a, wbuf->buf, wbuf->size);
  if(r) {
    fprintf(stderr, "archive_read_open_memory: %s, %d\n",
    archive_error_string(a), r);
    return r;
  }
  for (;;) {
    r = archive_read_next_header(a, &entry);
    if (r == ARCHIVE_EOF)
      break;
    if (r != ARCHIVE_OK)
      fprintf(stderr, "archive_read_next_header(): %s, %d\n",
   archive_error_string(a), r);
    else {
      const char *pathname = archive_entry_pathname(entry);
      if(0 == strcmp(pathname, "xl/worksheets/sheet1.xml"))
read_archive_data(a);
    }
  }
  archive_read_close(a);
  archive_read_free(a);
  return 0;
}

阅读全文
0 0
原创粉丝点击