How to find the clang internal include directory for use with libclang

Hi all,

I am using libclang to parse C source files using a compilation database. Overall, I am pretty happy with the results, but I have run into an issue that I don’t know how to solve.

Given an example program like:

#include <stddef.h>

int main(void)
{
  size_t hello = 5;
  return hello;
}

libclang will complain that fatal error: 'stddef.h' file not found. Doing some digging I find clang has it in on my Fedora 36 system as /usr/lib64/clang/14.0.5/include/stddef.h. How is one supposed to access this directory without hardcoding it? I thought maybe it would be include as a CMake variable that one could access, but that has not been my experience unless I am missing it. Somehow clangd is able to resolve this appropriately, so I must be missing something extremely obvious.

Thanks,

Tristan Partin

> clang -print-resource-dir

will maybe print /usr/lib64/clang/14.0.5.

Yep, this is working on my system. I will roll with it for now, but surely there is a better way.

Maybe the -MJ option gets you one step further:

clang -MJ foo.json -c foo.c -o foo.o

foo.json describes the compilation.

I don’t have much familiarity with libclang, but I can provide an answer from a clangd perspective:

The place where clangd picks up clang’s default built-in include paths is the createInvocation() call here. This function is documented to, among other things, “prob[e] the system for settings like standard library locations”.

Since libclang is a C API wrapper, you would not be calling createInvocation() directly, but a libclang API that calls it in its implementation (or which calls some code also called by createInvocation()). I don’t know off the top of my head what libclang API you need to use, but that’s a potential direction to look.

https://searchfox.org/llvm/rev/625796f408cc733f64aadd76171f13390217c201/clang/include/clang/Frontend/Utils.h#228

This line really makes me think that there is no good way to do what I am trying to do. Using the binary to probe for paths?

This was definitely a great pointer.

I think the best solution is probably what @tschuett said for now. I did comment on the llvm pkg-config issue though, since that would be the best solution.

Can you share what libclang API / calls you’re using?

I feel like libclang should also give you an opportunity to specify a compiler command line, similar to Args in createInvocation().