Помогите скомпилировать seek-bzip2 на Windows - PullRequest
0 голосов
/ 15 декабря 2010

Я не могу заставить замечательный маленький "seek-bzip2" Джеймса Тейлора скомпилировать под Windows? Он может индексировать архив bzip2, а затем использовать этот индекс для обеспечения произвольного доступа к отдельным блокам архива.

Он написан на C и требует длинных 64 бит и доступен здесь: http://bitbucket.org/james_taylor/seek-bzip2

Я не могу его скомпилировать на любом бесплатном компиляторе Windows C.

  • Borland не имеет необходимых заголовочных файлов.
  • lcc компилирует его, но он завершается неудачно с «неожиданным EOF» в любом файле bzip2.
  • mingw скомпилирует его, если вы уберете флаг "-m64", но произойдет сбой так же, как lcc выше.

У бесплатных компиляторов не очень хорошая поддержка отладки, и MS Visual Studio отказывается устанавливать на мой съемный жесткий диск, а дискам C и D моего нетбука не хватает места.


РЕДАКТИРОВАТЬ Я перефразировал этот вопрос, так как я просил кого-то перенести его для меня, но я счастлив попытаться перенести его сам. Я просто не знаю, с чего начать. Я не прикасался к Си с тех пор, как 64-битные типы стали обычным явлением.

1 Ответ

2 голосов
/ 15 декабря 2010

По умолчанию stdin и stdout будут работать в текстовом режиме, переводя 0A -> 0D 0A.Вам нужно изменить main-seekzunzip для _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
  • forward-Declare get_bits, read_bunzip и start_bunzip из micro-bunzip.c в micro-bunzip.h
  • изменить write и lseek на _write и _lseek (снова может быть только MSVC)

Тогда это сработало для меня, после того, как я понял, что параметр командной строки был смещением битов (т.е. 32 для первого блока), а не смещением байтов.

...