2013-06-05 3 views
0

요약 :libgit2 library (소스는 GitHub에서 사용 가능)을 사용하는 Win32 C++ 콘솔 응용 프로그램을 빌드하는 방법에 대한 아주 작은 예제가 있습니까?Windows에서 기본 C++ 응용 프로그램에서 libgit2를 사용하는 방법은 무엇입니까? (Microsoft VC++)

나는 CMake를 사용하여 readme와 wiki를 how to build the library on Windows에 따라 왔으며 원활하게 작동했습니다 (단 하나의 단위 테스트 오류 만).

이제 Microsoft Visual Studio C++ 2010 (the.vcxprojthe.sln)을 사용하여 라이브러리를 사용하는 간단한 콘솔 응용 프로그램을 만들고 싶습니다. libgit2 예제에서 general.c 코드를 발견했으며, C++ 응용 프로그램에서도 동일한 작업을 수행하려고합니다. 성공하지 못했습니다 - 오늘 정말 바보 같아요.

C++과 Qt에 libqgit2가 있습니다. 순수한 C++과 비슷한 것이 있습니까? 또는 C++ 응용 프로그램에서 C 라이브러리를 사용하는 방법이 있습니까?

가 업데이트 : 이름을 변경 한general.cgeneral.cpp 때문에, libgit2 프로젝트와 lib 디렉토리 파일의 경로에 대한 경로를 포함 추가 #include <cstdio>#include <stdio.h>을 변경하고 컴파일. 다음 링크 오류가 표시됩니다.

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 *)" ([email protected]@[email protected]) 
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 ========== 
+1

"성공하지 못함"이라고 말하면 무엇을 의미합니까? 어떤 종류의 문제가 있습니까? libgit2는 기본적으로'__stdcall'을 사용하고 MSVC는 기본적으로'__cdecl' 프로젝트를 생성합니다!) –

+0

@EdwardThomson : updated. – pepr

답변

3

이것은 내게 calling convention mismatch을 강력하게 제안합니다. libgit2는 여러 가지 이유로 기본적으로 __stdcall을 사용하지만 Visual Studio는 __cdecl 호출 규칙을 사용하는 프로젝트를 기본적으로 만듭니다. 프로그램이 호출 규칙을 사용하고 다른 호출 규칙을 사용하여 libgit2를 호출 할 수 있지만 가장 쉬운 해결책은 둘 다 동일한 호출 규칙을 사용하는 것입니다. ,

cmake %PATH_TO_LIBGIT2_SOURCE% -DTHREADSAFE=ON -DSTDCALL=OFF 
cmake --build . 
+0

정확히 그 이유가있는 것 같습니다. 이제는 잘 컴파일됩니다. 예제를 실행하면 어설 션이 발생하지만 이는 또 다른 이야기입니다. 고마워, 많이) – pepr

+0

정말 도움이! MSVC가 SysV ABI를 기본적으로 사용하는 이유는 무엇입니까? :) – rostamn739

+1

@ rostamn739이 q & a는 이제 조금 구식입니다. libgit2는 이제 나머지 기본값 (msvc, win32 api 등)과 일치시키기 위해 기본적으로'cdecl'을 사용합니다. 이제'stdcall' (아마도 .NET ffi)이 필요하다면 cmake 단계에서'-DSTDCALL = ON'을 지정할 수 있습니다. –

1

당신이 CMake에서 프로젝트를 생성 한 경우는 조금 놀라운 : 당신이 libgit2를 구성 할 때

, 당신은 __cdecl 호출 규칙을 내장 된 라이브러리를 방출하게됩니다 STDCALL 플래그를 해제 할 수 있습니다 조금이라도 당신이 libgit2.lib에 연결하지 않았을 수 있습니다. 프로젝트 등록 정보 -> 구성 등록 정보 -> 링커 -> 입력 -> 추가 종속성에 git2.dll이 있는지 확인하십시오.

link to git2.lib

+0

나는 그렇게했다고 믿는다. 내가 볼 수있는 유일한 차이점은'Debug' 디렉토리를 * Aditional Library Directories *에 넣은 다음 * Aditional Dependencies * 목록에서 일반'git2.lib'을 사용했다는 것입니다. 다른 생각은 C/C++ 코드 생성을 통해 런타임 라이브러리를 설정해야한다는 것입니다. – pepr

+1

호기심을 불러 일으키는 중 ...Windows * 8을 사용하고 있기 때문에 Visual Studio 2012에서 가져온 평면 윈도우 모양입니까? (솔직히, 나는 마치 마이크로 소프트가 우리를 실험 동물로 데려 간 것처럼 느낀다.) – pepr

+0

나는 둘 다 동시에 업데이트 할 수있다. : P –