Добрый день.
Мне предстоит использовать функционал 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 все в порядке...
Хочется узнать, в чем тут проблема. Помогите пожалуйста.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей