帮助在Windows上编译seek-bzip2

时间:2010-12-15 14:22:37

标签: c windows compression archive bzip2

我无法让James Taylor在Windows下编译出色的“seek-bzip2”?它可以索引bzip2存档,然后使用该索引提供对存档的各个块的随机访问。

它是用C语言编写的,需要64位长的长度,可以在这里找到:http://bitbucket.org/james_taylor/seek-bzip2

我无法在任何免费的Windows C编译器上编译它。

  • Borland没有一些必需的头文件。
  • lcc编译它,但它在任何bzip2文件中都出现“意外的EOF”。
  • 如果删除“-m64”标志,
  • mingw将编译它,但它将以与上面的lcc相同的方式失败。

免费编译器似乎没有很好的调试支持,MS Visual Studio拒绝在我的移动硬盘上安装,而我的上网本的C和D驱动器缺乏足够的空间。


编辑我已经对这个问题进行了重写,因为我要求有人为我移植它,但我很乐意尝试自己移植它。我只是不知道从哪里开始。我没有触及C,因为在64位类型变得普遍之前。

1 个答案:

答案 0 :(得分:2)

默认情况下,stdin和stdout将在文本模式下工作,翻译0A - > 0D 0A。你需要在uncompressblock之前修改seek-bunzip的main到_setmode stdin和stdout作为二进制文件:

int main( int argc, char *argv[] )
{
    unsigned long pos = atol( argv[1] );
    int status;
    _setmode(0, _O_BINARY);
    _setmode(1, _O_BINARY);
    status = uncompressblock( 0, pos );
    if ( status )
        fprintf( stderr, "\n%s\n", bunzip_errors[-status] );
}

使用MSVC ++ 10可以解决这个问题。您可能需要在其他编译器上丢失_setmode和_O_BINARY的前导下划线 - 我不确定。除此之外我还需要:

  • 删除unistd.h包含
  • 添加包括:
    • micro-bunzip.h:sys / types.h
    • micro-bunzip.c:sys / types.h
    • seek-bunzip.c:sys / types.h,io.h,fnctl.h
  • 来自micro-bunzip.c的micro-bunzip.h中的forward-declare get_bits,read_bunzip和start_bunzip
  • writelseek更改为_write_lseek(也可能只是MSVC)

在我意识到命令行参数是位偏移(即第一个块为32)而非字节偏移后,它对我有用。