When is it necessary to use the flag -stdlib=libstdc++?
Solution 1
On Linux: In general, all commonly available linux distributions will use libstdc++ by default, and all modern versions of GCC come with a libstdc++ that supports C++11. If you want to compile c++11 code here, use one of:
-
g++ -std=c++11 input.cxx -o a.out
(usually GNU compiler) g++ -std=gnu++11 input.cxx -o a.out
On OS X before Mavericks: g++
was actually an alias for clang++
and Apple's old version of libstdc++ was the default. You could use libc++ (which included c++11 library support) by passing -stdlib=libc++
. If you want to compile c++11 code here, use one of:
-
g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
(clang, not GNU compiler!) -
g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
(clang, not GNU compiler!) clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
On OS X since Mavericks: libc++ is the default and you should not pass any -stdlib=<...>
flag. Since Xcode 10, building against libstdc++ is not supported at all anymore. Existing code built against libstdc++ will keep working because libstdc++.6.dylib
is still provided, but compiling new code against libstdc++ is not supported.
clang++ -std=c++11 input.cxx -o a.out
clang++ -std=gnu++11 input.cxx -o a.out
Solution 2
When is it necessary to use use the flag
-stdlib=libstdc++
for the compiler and linker when compiling with gcc?
Short answer: never
Longer answer: -stdlib
is a Clang flag and will not work with any version of GCC ever released. On Mac OS X sometimes the gcc
and g++
commands are actually aliases for Clang not GCC, and the version of libstdc++ that Apple ships is ancient (circa 2008) so of course it doesn't support C++11. This means that on OS X when using Clang-pretending-to-be-GCC, you can use -stdlib=libc++
to select Clang's new C++11-compatible library, or you can use -stdlib=libstdc++
to select the pre-C++11 antique version of libstdc++ that belongs in a museum. But on GNU/Linux gcc
and g++
really are GCC not Clang, and so the -stdlib
option won't work at all.
Does the compiler automatically use libstdc++?
Yes, GCC always uses libstdc++ unless you tell it to use no standard library at all with the -nostdlib
option (in which case you either need to avoid using any standard library features, or use -I
and -L
and -l
flags to point it to an alternative set of header and library files).
I am using gcc4.8.2 on Ubuntu 13.10 and I would like to use the c++11 standard. I already pass
-std=c++11
to the compiler.
You don't need to do anything else. GCC comes with its own implementation of the C++ standard library (libstdc++) which is developed and tested alongside GCC itself so the version of GCC and the version of libstdc++ are 100% compatible. If you compile with -std=c++11
then that enables the C++11 features in g++
compiler and also the C++11 features in the libstdc++ headers.
Solution 3
The compiler uses the libstdc++ automatically, if you use the g++ frontend, not the gcc frontend.
Raymond Valdes
Updated on December 08, 2021Comments
-
Raymond Valdes over 2 years
When is it necessary to use use the flag
-stdlib=libstdc++
for the compiler and linker when compiling with gcc?Does the compiler automatically use libstdc++?
I am using gcc4.8.2 on Ubuntu 13.10 and I would like to use the c++11 standard. I already pass
-std=c++11
to the compiler. -
Aaron McDaid over 10 yearsIndeed. Just to clarify: The OP asked "when compiling with gcc?". If one runs
gcc
on a bunch of.o
files, then I think it assume they're just C programs and it doesn't link in any C++ stuff. But if you useg++
(or if you have any cpp files on thegcc
command line), then I think it'll realise that stdc++ should be included. But I'm not too certain about this. Is this what you're saying? -
Raymond Valdes over 10 yearsIf I understand this correctly, then
libstdc++
supports c++11 for linux but not OSX10.9. -> c++11 code on osx10.9 must be compiled/linked with-stdlib=libc++
. -
Raymond Valdes over 10 yearsTo clarify my question, when I said gcc I meant the gnu compiler collection (as a whole). Since I'm talking about c++ code, then I would be using the g++ frontend.
-
Bill Lynch over 10 years@raymondvaldes: That's correct. Apple refuses to distribute newer versions of libstdc++ that would contain C++11 support.
-
hithwen about 10 yearsCan I use libstdc++ with clang (not clang++)?
-
Bill Lynch about 10 years@hithwen: libstdc++ is the C++ standard library. It doesn't make much sense to use it with clang instead of clang++.
-
Bill Lynch about 10 years@hithwen: I don't think your problem is related to this answer. I'd recommend creating a new question to ask this.
-
nn0p over 7 yearsWhat's the difference between
libc++
andlibstdc++
? Are they both c++ standard runtime library? -
Bill Lynch over 7 years@nn0p yes. They are two different implementations of the c++ standard library. One by the gcc folks, one by the llvm folks.
-
garyF over 6 yearsWow. This one was not obvious.
-
Jonathan Wakely almost 6 years@RaymondValdes when referring to the whole it's conventional to say GCC, to distinguish it from the
gcc
driver program. -
Jonathan Wakely almost 6 years@Torsten, what you're referring to is automatically linking to libstdc++ if you use
g++
rather thangcc
. If you compile a C++ file (one with an extension like.cc
or.C
or.cpp
) withgcc
then it compiles the code using the C++ front-end and automatically makes the libstdc++ headers available via#include
, exactly the same as when you compile withg++
. Only the linking step handles libstdc++ differently depending whether you usegcc
org++
. -
user2864740 over 4 yearsTo avoid the silly "g++" and "gcc" nonsense on OS X, it's probably time-saving to explicitly use
g++-mp-9
(or whatever flavor of GCC install has been performed) during compilation, if that's the goal - in which case the real GNU libstdc++ library will be used by the real GNU G++ compiler, not the old OS X "libstdc++" (or newer libc++) library on faked compatibility-shim "g++". -
tjysdsg almost 4 yearsI used clang in my project, but for CI the compiler is set to gcc by default. So this is exactly the problem that occurred. gcc doesn't support
-stdlib
so the CI always failed -
Louis Dionne over 2 yearsThis answer is good, but it should be updated to say that as of recently,
-stdlib=libstdc++
should simply not be used on macOS, since libstdc++ is not shipped in the Apple SDKs anymore. -
Bill Lynch over 2 years@LouisDionne: I wrote the original answer a decade ago. Feel free to edit it as appropriate.