Доступ к полю git_odb_writepack в libgit2 дает ошибку разыменования указателя на неполный тип

Я использую libgit2 и хочу записать пакетный файл в odb, созданный с помощью git_repository_odb. Поэтому я вызываю git_odb_write_pack и инициализирую *git_odb_writepack. Затем, когда я пытаюсь получить доступ к полю структуры writepack, я получаю ошибку компилятора «разыменование указателя на неполный тип». Вот код:

#include <stdio.h>
#include <git2.h>

void check_error(int code, char *action) {
    if (code) {
        printf("Error %d, %s\n", code, action);
        exit(1);
    }
}

static int my_git_transfer_progress_callback(const git_transfer_progress *stats, void *payload) {
    printf("Got transfer callback\n");
    return 0;
}

int main(int argc, char **argv) {
    int error;

    const char *repo_path = "/path/to/repo";
    git_repository *repo = NULL;
    error = git_repository_open(&repo, repo_path);
    check_error(error, "opening repo");

    git_odb *odb = NULL;
    error = git_repository_odb(&odb, repo);
    check_error(error, "initializing odb");

    git_odb_writepack *writepack = NULL;
    char *payload = "here's my payload";
    error = git_odb_write_pack(&writepack, odb, my_git_transfer_progress_callback, payload);
    check_error(error, "opening pack writing stream");

    printf("Address: %u\n", writepack->backend);  // <-- Line generating the error.

    return 0;
}

Затем я компилирую и получаю ошибку:

$ gcc -lgit2 writepack_error.c && LD_LIBRARY_PATH=/usr/local/lib ./a.out
writepack_error.c: In function 'main':
writepack_error.c:33: error: dereferencing pointer to incomplete type

Я использую libgit2 версии 0.21.0. Я новичок в C и libgit2, поэтому я могу делать что-то глупое. Насколько я понимаю, эта ошибка «разыменования» означает, что мне не удалось определить или включить структуру или typedef. Однако я думал, что libgit2 требует только одного включения, #include <git2.h>.


person Yash    schedule 02.09.2014    source источник


Ответы (1)


Нормальное использование покрывается git2.h. Некоторые функции хранятся в каталоге sys/, чтобы указать, что они считаются более продвинутыми.

В частности, похоже, что это может быть ошибка, поскольку git2.h не включает git2/odb_backend.h. Пока вы можете просто включить его вручную.

person Carlos Martín Nieto    schedule 02.09.2014
comment
Да, я думаю, это все, спасибо. Я добавил #include <git2/odb_backend.h>, и мой пример кода заработал. Я также подал github.com/libgit2/libgit2/issues/2551 - person Yash; 03.09.2014