| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | 
 |           "http://www.w3.org/TR/html4/strict.dtd"> | 
 | <!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ --> | 
 | <html> | 
 | <head> | 
 |   <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | 
 |   <title>"libc++" C++ Standard Library</title> | 
 |   <link type="text/css" rel="stylesheet" href="menu.css"> | 
 |   <link type="text/css" rel="stylesheet" href="content.css"> | 
 | </head> | 
 |  | 
 | <body> | 
 | <div id="menu"> | 
 |   <div> | 
 |     <a href="http://llvm.org/">LLVM Home</a> | 
 |   </div> | 
 |  | 
 |   <div class="submenu"> | 
 |     <label>libc++ Info</label> | 
 |     <a href="/index.html">About</a> | 
 |   </div> | 
 |  | 
 |   <div class="submenu"> | 
 |     <label>Quick Links</label> | 
 |     <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a> | 
 |     <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a> | 
 |     <a href="http://llvm.org/bugs/">Bug Reports</a> | 
 |     <a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a> | 
 |     <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a> | 
 |   </div> | 
 | </div> | 
 |  | 
 | <div id="content"> | 
 |   <!--*********************************************************************--> | 
 |   <h1>"libc++" C++ Standard Library</h1> | 
 |   <!--*********************************************************************--> | 
 |  | 
 |   <p>libc++ is a new implementation of the C++ standard library, targeting | 
 |      C++11.</p> | 
 |  | 
 |   <p>All of the code in libc++ is <a | 
 |      href="http://llvm.org/docs/DeveloperPolicy.html#license">dual licensed</a> | 
 |      under the MIT license and the UIUC License (a BSD-like license).</p> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2 id="goals">Features and Goals</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 |     <ul> | 
 |         <li>Correctness as defined by the C++11 standard.</li> | 
 |         <li>Fast execution.</li> | 
 |         <li>Minimal memory use.</li> | 
 |         <li>Fast compile times.</li> | 
 |         <li>ABI compatibility with gcc's libstdc++ for some low-level features | 
 |             such as exception objects, rtti and memory allocation.</li> | 
 |         <li>Extensive unit tests.</li> | 
 |     </ul> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2 id="why">Why a new C++ Standard Library for C++11?</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 |   <p>After its initial introduction, many people have asked "why start a new | 
 |      library instead of contributing to an existing library?" (like Apache's | 
 |      libstdcxx, GNU's libstdc++, STLport, etc).  There are many contributing | 
 |      reasons, but some of the major ones are:</p> | 
 |  | 
 |   <ul> | 
 |   <li><p>From years of experience (including having implemented the standard | 
 |       library before), we've learned many things about implementing | 
 |       the standard containers which require ABI breakage and fundamental changes | 
 |       to how they are implemented.  For example, it is generally accepted that | 
 |       building std::string using the "short string optimization" instead of | 
 |       using Copy On Write (COW) is a superior approach for multicore | 
 |       machines (particularly in C++11, which has rvalue references).  Breaking | 
 |       ABI compatibility with old versions of the library was | 
 |       determined to be critical to achieving the performance goals of | 
 |       libc++.</p></li> | 
 |  | 
 |   <li><p>Mainline libstdc++ has switched to GPL3, a license which the developers | 
 |       of libc++ cannot use.  libstdc++ 4.2 (the last GPL2 version) could be | 
 |       independently extended to support C++11, but this would be a fork of the | 
 |       codebase (which is often seen as worse for a project than starting a new | 
 |       independent one).  Another problem with libstdc++ is that it is tightly | 
 |        integrated with G++ development, tending to be tied fairly closely to the | 
 |        matching version of G++.</p> | 
 |     </li> | 
 |  | 
 |   <li><p>STLport and the Apache libstdcxx library are two other popular | 
 |       candidates, but both lack C++11 support.  Our experience (and the | 
 |       experience of libstdc++ developers) is that adding support for C++11 (in | 
 |       particular rvalue references and move-only types) requires changes to | 
 |       almost every class and function, essentially amounting to a rewrite. | 
 |       Faced with a rewrite, we decided to start from scratch and evaluate every | 
 |       design decision from first principles based on experience.</p> | 
 |  | 
 |       <p>Further, both projects are apparently abandoned: STLport 5.2.1 was | 
 |       released in Oct'08, and STDCXX 4.2.1 in May'08.</p> | 
 |  | 
 |     </ul> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2 id="requirements">Platform Support</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 |    <p>libc++ is known to work on the following platforms, using g++-4.2 and | 
 |       clang (lack of C++11 language support disables some functionality).</p> | 
 |  | 
 |     <ul> | 
 |      <li>Mac OS X i386</li> | 
 |      <li>Mac OS X x86_64</li> | 
 |     </ul> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2 id="dir-structure">Current Status</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 |    <p>libc++ is a 100% complete C++11 implementation on Apple's OS X. </p> | 
 |    <p>LLVM and Clang can self host in C++ and C++11 mode with libc++ on Linux.</p> | 
 |  | 
 |    <p> | 
 |    Ports to other platforms are underway. Here are recent test | 
 |    results for <a href="results.Windows.html">Windows</a> | 
 |    and <a href="results.Linux.html">Linux</a>. | 
 |    </p> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2>Get it and get involved!</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 |   <p>First please review our | 
 |      <a href="http://llvm.org/docs/DeveloperPolicy.html">Developer's Policy</a>. | 
 |  | 
 |   <p>To check out the code, use:</p> | 
 |  | 
 |   <ul> | 
 |   <li><code>svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx</code></li> | 
 |   </ul> | 
 |  | 
 |   <p> | 
 |      On Mac OS 10.7 (Lion) and later, the easiest way to get this library is to install | 
 |      Xcode 4.2 or later.  However if you want to install tip-of-trunk from here | 
 |      (getting the bleeding edge), read on.  However, be warned that Mac OS | 
 |      10.7 will not boot without a valid copy of <code>libc++.1.dylib</code> in | 
 |      <code>/usr/lib</code>. | 
 |   </p> | 
 |  | 
 |   <p> | 
 |      Next: | 
 |   </p> | 
 |    | 
 |   <ul> | 
 |     <li><code>cd libcxx/lib</code></li> | 
 |     <li><code>export TRIPLE=-apple-</code></li> | 
 |     <li><code>./buildit</code></li> | 
 |     <li><code>ln -sf libc++.1.dylib libc++.dylib</code></li> | 
 |   </ul> | 
 |    | 
 |   <p> | 
 |      That should result in a libc++.1.dylib and libc++.dylib.  The safest thing | 
 |      to do is to use it from where your libcxx is installed instead of replacing | 
 |      these in your Mac OS. | 
 |   </p> | 
 |  | 
 |   <p> | 
 |   To use your system-installed libc++ with clang you can: | 
 |   </p> | 
 |  | 
 |   <ul> | 
 |     <li><code>clang++ -stdlib=libc++ test.cpp</code></li> | 
 |     <li><code>clang++ -std=c++11 -stdlib=libc++ test.cpp</code></li> | 
 |   </ul> | 
 |  | 
 |   <p> | 
 |   To use your tip-of-trunk libc++ on Mac OS with clang you can: | 
 |   </p> | 
 |  | 
 |   <ul> | 
 |     <li><code>export DYLD_LIBRARY_PATH=<path-to-libcxx>/lib</code> | 
 |     <li><code>clang++ -std=c++11 -stdlib=libc++ -nostdinc++ | 
 |          -I<path-to-libcxx>/include -L<path-to-libcxx>/lib | 
 |          test.cpp</code></li> | 
 |   </ul> | 
 |  | 
 |   <p>To run the libc++ test suite (recommended):</p> | 
 |  | 
 |   <ul> | 
 |   <li><code>cd libcxx/test</code></li> | 
 |   <li><code>./testit</code></li> | 
 |      <ul> | 
 |        <li>You can alter the command line options <code>testit</code> uses | 
 |        with <code>export OPTIONS="whatever you need"</code></li> | 
 |      </ul> | 
 |   </ul> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h3>Notes</h3> | 
 |   <!--=====================================================================--> | 
 |  | 
 | <p> | 
 | Building libc++ with <code>-fno-rtti</code> is not supported.  However linking | 
 | against it with <code>-fno-rtti</code> is supported. | 
 | </p> | 
 |  | 
 |   <p>Send discussions to the | 
 |   (<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">clang mailing list</a>).</p> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2>Build on Linux using CMake and libsupc++.</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 |   <p> | 
 |      You will need libstdc++ in order to provide libsupc++. | 
 |   </p> | 
 |    | 
 |   <p> | 
 |      Figure out where the libsupc++ headers are on your system. On Ubuntu this | 
 |      is <code>/usr/include/c++/<version></code> and | 
 |      <code>/usr/include/c++/<version>/<target-triple></code> | 
 |   </p> | 
 |    | 
 |   <p> | 
 |      You can also figure this out by running | 
 |      <pre> | 
 | $ echo | g++ -Wp,-v -x c++ - -fsyntax-only | 
 | ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" | 
 | ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include" | 
 | #include "..." search starts here: | 
 | #include <...> search starts here: | 
 |  /usr/include/c++/4.7 | 
 |  /usr/include/c++/4.7/x86_64-linux-gnu | 
 |  /usr/include/c++/4.7/backward | 
 |  /usr/lib/gcc/x86_64-linux-gnu/4.7/include | 
 |  /usr/local/include | 
 |  /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed | 
 |  /usr/include/x86_64-linux-gnu | 
 |  /usr/include | 
 | End of search list. | 
 |      </pre> | 
 |  | 
 |       Note the first two entries happen to be what we are looking for. This | 
 |       may not be correct on other platforms. | 
 |   </p> | 
 |    | 
 |   <p> | 
 |      We can now run CMake: | 
 |      <ul> | 
 |        <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles" | 
 |                 -DLIBCXX_CXX_ABI=libsupc++ | 
 |                 -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/" | 
 |                 -DCMAKE_BUILD_TYPE=Release | 
 |                 -DCMAKE_INSTALL_PREFIX=/usr | 
 |                 <libc++-source-dir></code></li> | 
 |        <li><code>make</code></li> | 
 |        <li><code>sudo make install</code></li> | 
 |      </ul> | 
 |      <p> | 
 |         You can now run clang with -stdlib=libc++. | 
 |      </p> | 
 |   </p> | 
 |  | 
 |   <!--=====================================================================--> | 
 |   <h2>Design Documents</h2> | 
 |   <!--=====================================================================--> | 
 |  | 
 | <ul> | 
 | <li><a href="atomic_design.html"><tt><atomic></tt></a></li> | 
 | <li><a href="type_traits_design.html"><tt><type_traits></tt></a></li> | 
 | <li><a href="http://marshall.calepin.co/llvmclang-and-standard-libraries-on-mac-os-x.html">Excellent notes by Marshall Clow</a></li> | 
 | </ul> | 
 |  | 
 | </div> | 
 | </body> | 
 | </html> |