I am trying to integrate libgit2
(1.5.0) into my project. The compilation failes due to missing type definitions.
The CMakeLists.txt of my project includes the include
directory and the libgit2.a
file:
target_include_directories(myprj PUBLIC ../libgit2/src/libgit2-1.5.0/include)
set(myprj "${CMAKE_SOURCE_DIR}/lib/libgit2.a")
link_directories(myprj ${PROJECT_SOURCE_DIR}/lib)
target_link_libraries(myprj PUBLIC ${libgit} crypto ssl)
The following code is a simplified version of the code I am using, but it should demonstrate the problem:
#include <git2.h>
git_reference *ref;
git_branch_t btype;
int code = git_branch_next(&ref, &btype, iterator);
if(code != 0)
return code;
char* name = ref->name;
The compiler fails with the error:
error: invalid use of incomplete typedef ‘git_reference’
char* name = ref->name
^~
The include
directory defines the type but the stuct itself is defined in the src
directory only.
libgit2-1.5.0/include/git2/types.h (source)
typedef struct git_reference git_reference;
libgit2-1.5.0/src/libgit2/refs.h(source)
struct git_reference {
//...
};
I have tried to fix it by importing the src
dir into my project but this doesnt work because of missing includes.
Import in Cmake:
target_include_directories(myprj PUBLIC ../libgit2/src/libgit2-1.5.0/src/libgit2)
Error:
libgit2/src/libgit2-1.5.0/src/libgit2/common.h:10:10: fatal error: git2_util.h: File or directory not found
10 | #include "git2_util.h"
I think this is on purpose, to make git_reference
an opaque type. It can then be changed at will by the library authors without breaking compatibility.
To get the name of a reference, use git_reference_name
instead of accessing the field directly:
const char* name = git_reference_name(ref);