Ошибка libgit2 и Qt

Я хочу использовать git из приложения Qt. Пока что я использую QProcess, но я не хочу этим пользоваться. Итак, я нашел libgit2.

Это работает как ожидалось:

#include <QApplication>
#include "git2.h"int main(int argc, char* argv[])
{
git_repository* repo = 0;
git_clone(&repo, "/path_to/barerep", "/path_to/test_clone", NULL);
git_repository_free(repo);
repo = 0;
}

Но здесь git_clone вылетает.

int main(int argc, char* argv[])
{
QApplication a(argc, argv);

git_repository* repo = 0;
git_clone(&repo, "/path_to/barerep", "/path_to/test_clone", NULL);
git_repository_free(repo);
repo = 0;

return a.exec();
}

Ошибка:
*** Ошибка в `/ path_to / gittest ‘: free (): неверный указатель: 0x09d53a88 ***

Какие-либо предложения? Конечно, пропуск QApplication не является альтернативой. Та же ошибка происходит без return a.exec(),

Примечание: на самом деле, есть класс GitRepository с методом clone(const QString & url) (путь хранится где-то в классе).

Опять же, это работает

int main(int argc, char* argv[])
{
GitRepository g;
g.clone("path_to/barerep");
}

Но это не так. (QObject!)

int main(int argc, char* argv[])
{
QObject();  // <--
GitRepository g;
g.clone("path_to/barerep");
}

не.

bool GitRepository::clone(const QString & url)
{
git_repository* repo = 0;
git_clone(&repo, CSTR(url), CSTR(path()), NULL);
git_repository_free(repo);
repo = 0;

//loadFromTempDir();

return true;
}

Замена QApplication на QObject в первом примере подавляет ошибку.

2

Решение

Вам нужно позвонить git_libgit2_init () перед вызовом любых других функций libgit2. Как сказано в документации:

Эта функция должна вызываться перед любой другой функцией libgit2, чтобы установить глобальное состояние и потоки.

3

Другие решения

Подобные ошибки действительно трудно найти. У меня также были проблемы при смешивании библиотек Qt с другими библиотеками. Хитрость заключается в том, чтобы организовать ваш код так, чтобы в один модуль компиляции была включена только одна библиотека.

Создайте класс, охватывающий libgit2, и включите только заголовки libgit2 в файл cpp этого класса. Не включайте заголовки qt в один и тот же файл.

Обращайтесь только к libgit, бросьте свою обертку. Конечно, это кажется большой работой, но в результате ваш код станет чище, и эти загадочные ошибки исчезнут.

0

По вопросам рекламы [email protected]