[cfe-dev] libclang cannot find its resource dir on linux?

Milian Wolff mail at milianw.de
Wed Jan 8 05:48:34 PST 2014


On Tuesday 07 January 2014 18:13:16 Sean Silva wrote:
> This is a known problem for external tools and is a huge pain. The
> underlying problem is that the resource dir is looked up relative to the
> current executable. This works fine for clang which is installed in the
> right place so that this works.
> 
> The exact path that it looks up relative to the executable can be found in
> CompilerInvocation::GetResourcesPath in lib/Frontend/CompilerInvocation.cpp
> <http://clang.llvm.org/doxygen/CompilerInvocation_8cpp_source.html#l00895>.
> 
> Here are 3 ways to work around this:
> 
> 1. Put your executable in the same place as the clang binary.
> 2. Copy/symlink the resource dir to the same relative location from your
> executable as they are from the clang binary.
> 3. Pass the argument `-resource-dir /path/to/resource/dir`. It is a `clang
> -cc1` argument so you need to use the `-Xclang` prefix to pass it, i.e.
> `-Xclang -resource-dir -Xclang /path/to/resource/dir`.

There is a fourth one, which I came up with as a good-enough workaround:

Ask clang for the include paths, i.e.:

clang -xc++ -E -v /dev/null

That gives you a list of built-in search paths, including in my case: 
/usr/bin/../lib/clang/3.3/include

So you can parse the above command once, then pass these paths via -I to 
clang.

The advantage I see here is that you don't have to know the resource dir in 
advance, but can simply ask clang for it.

> On Tue, Jan 7, 2014 at 7:59 AM, Erik Verbruggen 
<erik.verbruggen at me.com>wrote:
> > Hi,
> > 
> > I have a small test program that behaves differently on linux and mac:
> >      CXIndex idx = clang_createIndex(1, 1);
> >     
> >     struct CXUnsavedFile unsaved[1];
> >     unsaved[0].Filename = "tst.c";
> >     unsaved[0].Contents = "#include <xmmintrin.h>\n";
> >     unsaved[0].Length = strlen(unsaved[0].Contents);
> >     CXTranslationUnit tu = clang_parseTranslationUnit(idx, "tst.c", 0, 0,
> > 
> > unsaved, 1, 0);
> > 
> > On macos, the translation unit is fine: when running clang_getInclusions
> > on it, I get the full path of xmmintrin.h. However, on linux this fails
> > with "tst.c:1:10: fatal error: 'xmmintrin.h' file not found". Running it
> > on
> > the command-line works fine though.
> > 
> > So, is this expected behaviour, or a bug?
> > 
> > -- Erik.
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

-- 
Milian Wolff
mail at milianw.de
http://milianw.de



More information about the cfe-dev mailing list