getting clang to find non-default libstdc++

Hello,

I am trying to use clang for the first time, on Ubuntu 10.04.

The default compiler on Ubuntu 10.04 is GCC 4.4, but I've built
GCC 4.7 from source and use it to compile C++11 programs.

Clang finds GCC 4.4's libstdc++ no problem, but I need it to
use GCC 4.7's libstdc++ because my program uses standard
library features that have been added between GCC 4.4 and 4.7.
How do I direct clang to find the 4.7 libstdc++?

I saw the following instructions on the "Get Started" page:

"If Clang cannot find your system libstdc++ headers, please
follow these instructions:
- 'gcc -v -x c++ /dev/null -fsyntax-only' to get the
path.
- Look for the comment "FIXME: temporary hack:
hard-coded paths" in clang/lib/Frontend/InitHeaderSearch.cpp
and change the lines below to include that path"

Is that the only way? Having to recompile the compiler to get
it to find a different standard library seems a bit excessive...
shouldn't one be able to switch standard libraries without
recompiling the compiler?

Thanks,
Nate

Hello,

I am trying to use clang for the first time, on Ubuntu 10.04.

The default compiler on Ubuntu 10.04 is GCC 4.4, but I've built
GCC 4.7 from source and use it to compile C++11 programs.

Clang finds GCC 4.4's libstdc++ no problem, but I need it to
use GCC 4.7's libstdc++ because my program uses standard
library features that have been added between GCC 4.4 and 4.7.
How do I direct clang to find the 4.7 libstdc++?

I saw the following instructions on the "Get Started" page:

"If Clang cannot find your system libstdc++ headers, please
follow these instructions:
- 'gcc -v -x c++ /dev/null -fsyntax-only' to get the
path.
- Look for the comment "FIXME: temporary hack:
hard-coded paths" in clang/lib/Frontend/InitHeaderSearch.cpp
and change the lines below to include that path"

Is that the only way? Having to recompile the compiler to get
it to find a different standard library seems a bit excessive...
shouldn't one be able to switch standard libraries without
recompiling the compiler?

Those comments are a bit out of date for linux. You should be able to
configure clang with --with-gcc-toolchain pointing to where you
install g++ 4.7.

Thanks,
Nate

Cheers,
Rafael

Yes, of course. Finding the standard library is no magic, you can simply add some -isystem, -L, and possibly -Wl,-rpath arguments to clang++ when using it. Use the -v option to see what clang is using by default, so you can just add the same with s/4.4/4.7/g. If clang puts one of its own directories first (before the gcc ones), be sure to specify it again yourself so it still ends up first. You can even try some flags like -nostdinc++ to clean up a bit (again, check with -v that the list makes sense).

Or if you install Clang alongside the gcc 4.7 installation, it should Just
Work without any further action. We look adjacent to the clang binaries for
a companion GCC installation specifically to support this (quite common)
use case.

> I am trying to use clang for the first time, on Ubuntu 10.04.
>
> The default compiler on Ubuntu 10.04 is GCC 4.4, but I've built
> GCC 4.7 from source and use it to compile C++11 programs.
>
> Clang finds GCC 4.4's libstdc++ no problem, but I need it to
> use GCC 4.7's libstdc++ because my program uses standard
> library features that have been added between GCC 4.4 and 4.7.
> How do I direct clang to find the 4.7 libstdc++?
>
> I saw the following instructions on the "Get Started" page:
>
> "If Clang cannot find your system libstdc++ headers, please
> follow these instructions:
> - 'gcc -v -x c++ /dev/null -fsyntax-only' to get the
> path.
> - Look for the comment "FIXME: temporary hack:
> hard-coded paths" in clang/lib/Frontend/InitHeaderSearch.cpp
> and change the lines below to include that path"
>
> Is that the only way? Having to recompile the compiler to get
> it to find a different standard library seems a bit excessive...
> shouldn't one be able to switch standard libraries without
> recompiling the compiler?

Those comments are a bit out of date for linux. You should be able to
configure clang with --with-gcc-toolchain pointing to where you
install g++ 4.7.

Thanks! I think the webpage should be updated to reflect this.
I attached a patch.

Regards,
Nate

find-libstdc++.patch (1.13 KB)

> > I am trying to use clang for the first time, on Ubuntu 10.04.
> >
> > The default compiler on Ubuntu 10.04 is GCC 4.4, but I've built
> > GCC 4.7 from source and use it to compile C++11 programs.
> >
> > Clang finds GCC 4.4's libstdc++ no problem, but I need it to
> > use GCC 4.7's libstdc++ because my program uses standard
> > library features that have been added between GCC 4.4 and 4.7.
> > How do I direct clang to find the 4.7 libstdc++?
> >
> > I saw the following instructions on the "Get Started" page:
> >
> > "If Clang cannot find your system libstdc++ headers, please
> > follow these instructions:
> > - 'gcc -v -x c++ /dev/null -fsyntax-only' to get the
> > path.
> > - Look for the comment "FIXME: temporary hack:
> > hard-coded paths" in clang/lib/Frontend/InitHeaderSearch.cpp
> > and change the lines below to include that path"
> >
> > Is that the only way? Having to recompile the compiler to get
> > it to find a different standard library seems a bit excessive...
> > shouldn't one be able to switch standard libraries without
> > recompiling the compiler?
>
> Those comments are a bit out of date for linux. You should be able to
> configure clang with --with-gcc-toolchain pointing to where you
> install g++ 4.7.

Thanks! I think the webpage should be updated to reflect this.
I attached a patch.

Can you mention that in general, Clang should automatically detect the best
version of libstdc++ headers available and use them, and that it will look
both for system installations of libstdc++ as well as installations
adjacent to clang itself?

The --with-gcc-toolchain should really be a fallback for when the
configuration is quite strange.

> > I am trying to use clang for the first time, on Ubuntu 10.04.
> >
> > The default compiler on Ubuntu 10.04 is GCC 4.4, but I've built
> > GCC 4.7 from source and use it to compile C++11 programs.
> >
> > Clang finds GCC 4.4's libstdc++ no problem, but I need it to
> > use GCC 4.7's libstdc++ because my program uses standard
> > library features that have been added between GCC 4.4 and 4.7.
> > How do I direct clang to find the 4.7 libstdc++?
> >
> > I saw the following instructions on the "Get Started" page:
> >
> > "If Clang cannot find your system libstdc++ headers, please
> > follow these instructions:
> > - 'gcc -v -x c++ /dev/null -fsyntax-only' to get the
> > path.
> > - Look for the comment "FIXME: temporary hack:
> > hard-coded paths" in clang/lib/Frontend/InitHeaderSearch.cpp
> > and change the lines below to include that path"
> >
> > Is that the only way? Having to recompile the compiler to get
> > it to find a different standard library seems a bit excessive...
> > shouldn't one be able to switch standard libraries without
> > recompiling the compiler?
>
> Those comments are a bit out of date for linux. You should be able to
> configure clang with --with-gcc-toolchain pointing to where you
> install g++ 4.7.

Thanks! I think the webpage should be updated to reflect this.
I attached a patch.

Can you mention that in general, Clang should automatically detect the
best version of libstdc++ headers available and use them, and that it
will look both for system installations of libstdc++ as well as
installations adjacent to clang itself?

The --with-gcc-toolchain should really be a fallback for when the
configuration is quite strange.

You callin' my configuration strange? :wink:

Updated patch is attached.

Regards,
Nate

find-libstdc++.patch (1.25 KB)

You callin' my configuration strange? :wink:

Updated patch is attached.

Linux, which was the main user of the "temporary hack", is fixed, so I
think this is OK. Chandler?

Regards,
Nate

Cheers,
Rafael

LGTM

Could someone commit it then?

Thanks,
Nate

Committed in r156911, thanks!

From Trunk on Debian Linux after including the update of libcxx and compile-rt under clang/runtime:

– Clang version: 3.2
CMake Error at tools/clang/runtime/compiler-rt/CMakeLists.txt:48 (add_subdirectory):
The source directory

/home/mdriftmeyer/DeveloperProjects/LLVMProject/trunk/llvm/tools/clang/runtime/compiler-rt/test

does not contain a CMakeLists.txt file.

– Host triple: x86_64-pc-linux
– Target triple: x86_64-pc-linux
– Target triple: x86_64-unknown-linux-gnu
– Native target architecture is X86
– Threads enabled.
– Configuring incomplete, errors occurred!
mdriftmeyer@horus:~/DeveloperProjects/LLVMProject/cmake-clang-llvm$

  • Marc

I dunno what this error is, will look into it more depth later, but the patch I committed only touched documentation, so it seems unlikely to have caused this. I suspect these are independent issues.

Doing an update on clang pulled in libcxx and compiler-rt.

Removing both today only restores place holders and a Makefile for both compiler-rt and libcxx.

So clearly, something prematurely got injected into both of those paths.

  • Marc