Я хочу использовать 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 в первом примере подавляет ошибку.
Вам нужно позвонить git_libgit2_init () перед вызовом любых других функций libgit2. Как сказано в документации:
Эта функция должна вызываться перед любой другой функцией libgit2, чтобы установить глобальное состояние и потоки.
Подобные ошибки действительно трудно найти. У меня также были проблемы при смешивании библиотек Qt с другими библиотеками. Хитрость заключается в том, чтобы организовать ваш код так, чтобы в один модуль компиляции была включена только одна библиотека.
Создайте класс, охватывающий libgit2, и включите только заголовки libgit2 в файл cpp этого класса. Не включайте заголовки qt в один и тот же файл.
Обращайтесь только к libgit, бросьте свою обертку. Конечно, это кажется большой работой, но в результате ваш код станет чище, и эти загадочные ошибки исчезнут.