Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Incomplete typedefs in libgit2

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:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

#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"

>Solution :

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);
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading