Как использовать libgit2 из собственного приложения C++ в Windows? (Майкрософт ВС++)

Резюме: есть ли небольшой пример того, как создать консольное приложение Win32 C++, использующее библиотеку libgit2? (исходники доступны на GitHub)?

Я ознакомился с файлом readme и вики по как собрать библиотеку в Windows с помощью CMake, и все работало гладко (только одна ошибка модульного тестирования).

Теперь я хочу создать простое консольное приложение, использующее библиотеку, используя Microsoft Visual Studio C++ 2010 (the.vcxproj и the.sln). Я нашел код general.c в примерах libgit2 и хочу сделать то же самое в своем приложении на C++. Никакого успеха -- сегодня я чувствую себя очень глупо...

Я заметил, что есть libqgit2 для C++ и Qt. Есть ли что-нибудь подобное для чистого C++? Или есть способ использовать библиотеку C из приложения C++?

Обновление: я переименовал general.c в general.cpp, добавил путь включения libgit2 к проекту и путь к файлам .lib, изменил #include <stdio.h> на #include <cstdio> и скомпилировал. Появляются следующие ошибки ссылок:

1>------ Build started: Project: libgit2_general, Configuration: Debug Win32 ------
1>general.obj : error LNK2019: unresolved external symbol _git_repository_free referenced in function _main
1>general.obj : error LNK2019: unresolved external symbol _git_config_get_string referenced in function _main
1>general.obj : error LNK2019: unresolved external symbol _git_config_get_int32 referenced in function _main
1>general.obj : error LNK2019: unresolved external symbol _git_config_open_ondisk referenced in function _main
1>general.obj : error LNK2019: unresolved external symbol _git_strarray_free referenced in function _main
... etc.
1>general.obj : error LNK2019: unresolved external symbol _git_repository_open referenced in function _main
1>general.obj : error LNK2019: unresolved external symbol _giterr_last referenced in function "void __cdecl check_error(int,char const *)" (?check_error@@YAXHPBD@Z)
1>D:\Tutorial\libgit2_general\Debug\libgit2_general.exe : fatal error LNK1120: 56 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

person pepr    schedule 05.06.2013    source источник
comment
Что вы имеете в виду, когда говорите «Нет успеха»? Какие у вас проблемы? (Обратите внимание: если у вас возникают ошибки компоновки, вы должны убедиться, что используете совместимые соглашения о вызовах: libgit2 по умолчанию использует __stdcall, а MSVC по умолчанию создает проекты __cdecl!)   -  person Edward Thomson    schedule 05.06.2013
comment
@ЭдвардТомсон: обновлено.   -  person pepr    schedule 05.06.2013


Ответы (2)


Это наводит на мысль о несоответствии соглашению о вызовах. libgit2 использует __stdcall по умолчанию по ряду причин, в то время как Visual Studio по умолчанию создает проекты, использующие соглашение о вызовах __cdecl. Хотя ваша программа может использовать любое соглашение о вызовах и успешно вызывать libgit2, используя другое, самое простое решение, вероятно, просто использовать одно и то же соглашение о вызовах для обоих.

Когда вы настраиваете libgit2, вы можете отключить флаг STDCALL, что заставит его создавать библиотеку, построенную с __cdecl соглашениями о вызовах:

cmake %PATH_TO_LIBGIT2_SOURCE% -DTHREADSAFE=ON -DSTDCALL=OFF
cmake --build .
person Edward Thomson    schedule 05.06.2013
comment
Кажется, именно в этом была причина. Теперь компилируется нормально. Выполнение примера вызвало утверждение, но это уже другая история. Большое спасибо ;) - person pepr; 06.06.2013
comment
действительно очень полезно! Есть идеи, почему MSVC по умолчанию использует SysV ABI? :) - person rostamn739; 10.06.2016
comment
@ rostamn739 Этот вопрос и ответ теперь немного устарел, libgit2 теперь использует cdecl по умолчанию, чтобы соответствовать остальным значениям по умолчанию (msvc, win32 api и т. д.). Теперь, если кто-то хочет stdcall (предположительно для .NET ffi), то можно указать -DSTDCALL=ON на этапе cmake. - person Edward Thomson; 10.06.2016

Это немного удивительно, если вы сгенерировали проект из CMake, но может случиться так, что вы не ссылаетесь на libgit2.lib. Убедитесь, что у вас есть git2.dll в свойствах проекта -> свойства конфигурации -> компоновщик -> ввод -> дополнительные зависимости.

ссылка на git2.lib

person Ben Straub    schedule 05.06.2013
comment
Я считаю, что я сделал это таким образом. Единственная разница, которую я вижу, заключается в том, что я поместил каталог Debug в Дополнительные каталоги библиотек, а затем использовал обычный git2.lib в списке Дополнительных зависимостей. Единственное, что пришло мне в голову, это то, что библиотека времени выполнения должна быть установлена ​​​​через генерацию кода C/C++. - person pepr; 06.06.2013
comment
Просто любопытно... Этот плоский вид окна исходит от Visual Studio 2012 или потому, что вы используете Windows 8? (Честно говоря, мне иногда кажется, что Microsoft взяла нас в качестве подопытных животных.) - person pepr; 06.06.2013
comment
Вы компилируете libgit2 через VC++ 2012 или через VC++ 2010? - person pepr; 07.06.2013
comment
Оба, в разные дни. :) CMake может генерировать файлы проекта либо с помощью -G "Visual Studio 10", либо -G "Visual Studio 11". - person Ben Straub; 07.06.2013