Почему приложение Qt с libqgit2 падает в режиме Debug?

255
06 апреля 2018, 18:30

Добрый день.

Мне предстоит использовать функционал libgit2 в приложении, которое будет написано на Qt. К сожалению, на данный момент, существует Qt wrapper только для версии libgit2-0.22.1 - libQgit2-0.22.1, так что выбирать не приходится. Для начала, я выкачал версию libgit2 отсюда, а libQgit2 стянул git'ом по ссылке на репозиторий указанной тут. Скачал последний CMake 3.11.0 и с помощью утилиты CMake gui настроил проект, указав в качестве исходников libQgit2 - корневую папку рабочей дирректории репозитория libQgit2, в качестве CMAKE_BUILD_TYPE - Release (Хотя, как мне потом объяснили, этот параметр игнорируется при дальнейшей сборке в MSVS2017).

  • LIBGIT2_FILENAME - false(чекбокс не отмечен);
  • LIBGIT2_INCLUDE_DIR - D:/CPP/GIT/libgit2-0.22.1/include;
  • LIBGIT2_LIBRARIES - LIBGIT2_LIBRARIES-NOTFOUND;
  • LIBGIT2_SRC_DIR - D:/CPP/GIT/libgit2-0.22.1;
  • PKG_CONFIG_EXECUTABLE - D:/Programs/vcpkg-master/vcpkg.exe.

Остальное не трогал, разве что еще не определился ZLIB_LIBRARY_DEBUG-NOTFOUND. Вот вывод CMake gui после Configure - Generate.

Using libgit2 source from D:/CPP/GIT/libgit2-0.22.1 
Checking for module 'libssh2' 
invalid command: libssh2 
Commands: 
  vcpkg search [pat]              Search for packages available to be built 
  vcpkg install <pkg>...          Install a package 
  vcpkg remove <pkg>...           Uninstall a package 
  vcpkg remove --outdated         Uninstall all out-of-date packages 
  vcpkg list                      List installed packages 
  vcpkg update                    Display list of packages for updating 
  vcpkg upgrade                   Rebuild all outdated packages 
  vcpkg hash <file> [alg]         Hash a file by specific algorithm, default SHA512 
  vcpkg help topics               Display the list of help topics 
  vcpkg help <topic>              Display help for a specific topic 
 
  vcpkg integrate install         Make installed packages available user-wide. Requires admin privileges on first use 
  vcpkg integrate remove          Remove user-wide integration 
  vcpkg integrate project         Generate a referencing nuget package for individual VS project use 
  vcpkg integrate powershel 
l      Enable PowerShell Tab-Completion 
 
  vcpkg export <pkg>... [opt]...  Exports a package 
  vcpkg edit <pkg>                Open up a port for editing (uses %EDITOR%, default 'code') 
  vcpkg import <pkg>              Import a pre-built library 
  vcpkg create <pkg> <url> 
             [archivename]        Create a new package 
  vcpkg owns <pat>                Search for files in installed packages 
  vcpkg env                       Creates a clean shell environment for development or compiling. 
  vcpkg version                   Display version information 
  vcpkg contact                   Display contact information to send feedback 
 
Options: 
  --triplet <t>                   Specify the target architecture triplet. 
                                  (default: %VCPKG_DEFAULT_TRIPLET%, see 'vcpkg help triplet') 
 
  --vcpkg-root <path>             Specify the vcpkg root directory 
                                  (default: %VCPKG_ROOT%) 
 
For more help (including examples) see the accompanying R 
EADME.md. 
 
   
 
========== LIBQGIT2 Build Information ========== 
Build Version: 0.22.1 
Install Prefix: D:/libqgit2 
 
To change any of these options, override them using -D{OPTION_NAME} on the commandline. 
To build and install LIBQGIT2, run "make" and "make install" 
 
Configuring done 
Generating done

При нажатии на кнопку Open Project открывается MSVS2017, в котором я делаю Build Solution два раза, при выбранном Debug и Release. В итоге получаю 8 файлов, по 4 для каждой версии - git2.lib, git2.dll, qgit2.lib, qgit2.dll. Файлы из версии Debug я переименовываю в git2d.lib, git2d.dll, qgit2d.lib и qgit2d.dll соответственно. Ошибок в момент сборки не происходит. Далее, я создаю новый проект Qt Widgets Application, он собирается qmake, а следовательно имеет .pro файл настроек. В этом файле я из контекстного меню выбираю Add Library... -> External library. В папке с проектом, я создаю директорию lib и кладу туда все 8 собранных файлов. В окне подключения библиотеки, в Library file я указываю файл D:\CPP\Qt\GitWidgetApp\lib\qgit2.lib, в Include path автоматом прописывается D:\CPP\Qt\GitWidgetApp - корневая директория проекта. Убираю галочки Linux, Mac, выбираю Linkage: - Static. В группе настроек Windows оставляю галочку на Add "d" suffix for debug version. Таким образом, мой .pro файл выглядит следующим образом:

QT       += core gui 
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 
 
TARGET = GitWidgetApp 
TEMPLATE = app 
CONFIG (debug, debug|release) { 
    CONFIG       += console 
} 
 
DEFINES += QT_DEPRECATED_WARNINGS 
 
SOURCES += \ 
        main.cpp \ 
        mainwindow.cpp 
 
HEADERS += \ 
        mainwindow.h \ 
        qgit2.h 
 
FORMS += \ 
        mainwindow.ui 
 
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lqgit2 
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lqgit2d 
 
INCLUDEPATH += $$PWD/. 
DEPENDPATH += $$PWD/. 
 
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/lib/qgit2.lib 
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/lib/qgit2d.lib

В корневую директорию проекта, я кидаю хидер qgit2.h из директории D:\CPP\GIT\libqgit2(это рабочая папка репозитория) и переименованную в qgit2 папку src, из которой я удаляю все .cpp файлы, оставляя только .h. В эту директорию qgit2, копирую содержимое директории D:\CPP\GIT\libgit2-0.22.1\include. После этого, создаю простую форму в Qt Designer, с кнопкой. В mainwindow.cpp прописываю вот что:

int MainWindow::on_btn_go_clicked()
{
    auto repository = new LibQGit2::Repository();
    try{
        repository->open ("D:/GIT/test_Nivelir_1");
    } catch (const LibQGit2::Exception& e){
        qDebug()<< e.message () << " -- ERROR;";
        return 1;
    }
    qDebug() << repository->listReferences () << " -- OK;";
    return 1;
}

Пример взял отсюда. Приложение все подхватывает, запускается, но вот в чем проблема: Если я собираю приложение в режиме Debug и нажимаю на кнопку, то приложение падает, выдавая следующую ошибку:

при попытке задебажить все это (F5), кидает на 496 строку qlist.h -

После n'ного нажатия F10, в консоль дебаггера выводится следующее:

Debugging starts 
HEAP[GitWidgetApp.exe]:  
Invalid address specified to RtlValidateHeap( 00000295A3B20000, 00000295A5B85080 ) 
Debug Assertion Failed! 
 
Program: ...esktop_Qt_5_11_0_MSVC2017_64bit2-Debug\debug\GitWidgetApp.exe 
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp 
Line: 904 
 
Expression: _CrtIsValidHeapPointer(block) 
 
For information on how your program can cause an assertion 
failure, see the Visual C++ documentation on asserts. 
 
(Press Retry to debug the application)

Что самое интересное, так это тот факт, что в режиме Release все в порядке... Хочется узнать, в чем тут проблема. Помогите пожалуйста.

READ ALSO
Подключение клиента ActiveMQ по SSL

Подключение клиента ActiveMQ по SSL

Имею простой клиент для высылания сообщений для ActiveMQ на C++ очень похожий на этот пример

199
Объекты компонента TImage

Объекты компонента TImage

Мне нужно создать двусвязный список из нарисованных мною картинокРисую я в компоненте TImage (прямоугольники и эллипсы)

197
Проблема с WebBrowser в Access (vba)

Проблема с WebBrowser в Access (vba)

Добрый день всем! Мне необходим на базе Access подготовить базу хранения и редактор правил на некотором DSLДля функциональности редактора использую...

286
Почему не работает конструкция this на JQuery?

Почему не работает конструкция this на JQuery?

Подскажите, почему не работает такая конструкция на JQuery?

211