Home | History | Annotate | Download | only in www
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2           "http://www.w3.org/TR/html4/strict.dtd">
      3 <!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
      4 <html>
      5 <head>
      6   <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      7   <title>"libc++" C++ Standard Library</title>
      8   <link type="text/css" rel="stylesheet" href="menu.css">
      9   <link type="text/css" rel="stylesheet" href="content.css">
     10 </head>
     11 
     12 <body>
     13 <div id="menu">
     14   <div>
     15     <a href="http://llvm.org/">LLVM Home</a>
     16   </div>
     17 
     18   <div class="submenu">
     19     <label>libc++ Info</label>
     20     <a href="/index.html">About</a>
     21   </div>
     22 
     23   <div class="submenu">
     24     <label>Quick Links</label>
     25     <a href="http://lists.llvm.org/mailman/listinfo/cfe-dev">cfe-dev</a>
     26     <a href="http://lists.llvm.org/mailman/listinfo/cfe-commits">cfe-commits</a>
     27     <a href="http://llvm.org/bugs/">Bug Reports</a>
     28     <a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a>
     29     <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a>
     30   </div>
     31 </div>
     32 
     33 <div id="content">
     34   <!--*********************************************************************-->
     35   <h1>"libc++" C++ Standard Library</h1>
     36   <!--*********************************************************************-->
     37 
     38   <p>libc++ is a new implementation of the C++ standard library, targeting
     39      C++11.</p>
     40 
     41   <p>All of the code in libc++ is <a
     42      href="http://llvm.org/docs/DeveloperPolicy.html#license">dual licensed</a>
     43      under the MIT license and the UIUC License (a BSD-like license).</p>
     44 
     45   <!--=====================================================================-->
     46   <h2 id="goals">Features and Goals</h2>
     47   <!--=====================================================================-->
     48 
     49     <ul>
     50         <li>Correctness as defined by the C++11 standard.</li>
     51         <li>Fast execution.</li>
     52         <li>Minimal memory use.</li>
     53         <li>Fast compile times.</li>
     54         <li>ABI compatibility with gcc's libstdc++ for some low-level features
     55             such as exception objects, rtti and memory allocation.</li>
     56         <li>Extensive unit tests.</li>
     57     </ul>
     58 
     59   <!--=====================================================================-->
     60   <h2 id="why">Why a new C++ Standard Library for C++11?</h2>
     61   <!--=====================================================================-->
     62 
     63   <p>After its initial introduction, many people have asked "why start a new
     64      library instead of contributing to an existing library?" (like Apache's
     65      libstdcxx, GNU's libstdc++, STLport, etc).  There are many contributing
     66      reasons, but some of the major ones are:</p>
     67 
     68   <ul>
     69   <li><p>From years of experience (including having implemented the standard
     70       library before), we've learned many things about implementing
     71       the standard containers which require ABI breakage and fundamental changes
     72       to how they are implemented.  For example, it is generally accepted that
     73       building std::string using the "short string optimization" instead of
     74       using Copy On Write (COW) is a superior approach for multicore
     75       machines (particularly in C++11, which has rvalue references).  Breaking
     76       ABI compatibility with old versions of the library was
     77       determined to be critical to achieving the performance goals of
     78       libc++.</p></li>
     79 
     80   <li><p>Mainline libstdc++ has switched to GPL3, a license which the developers
     81       of libc++ cannot use.  libstdc++ 4.2 (the last GPL2 version) could be
     82       independently extended to support C++11, but this would be a fork of the
     83       codebase (which is often seen as worse for a project than starting a new
     84       independent one).  Another problem with libstdc++ is that it is tightly
     85        integrated with G++ development, tending to be tied fairly closely to the
     86        matching version of G++.</p>
     87     </li>
     88 
     89   <li><p>STLport and the Apache libstdcxx library are two other popular
     90       candidates, but both lack C++11 support.  Our experience (and the
     91       experience of libstdc++ developers) is that adding support for C++11 (in
     92       particular rvalue references and move-only types) requires changes to
     93       almost every class and function, essentially amounting to a rewrite.
     94       Faced with a rewrite, we decided to start from scratch and evaluate every
     95       design decision from first principles based on experience.</p>
     96 
     97       <p>Further, both projects are apparently abandoned: STLport 5.2.1 was
     98       released in Oct'08, and STDCXX 4.2.1 in May'08.</p>
     99 
    100     </ul>
    101 
    102   <!--=====================================================================-->
    103   <h2 id="requirements">Platform Support</h2>
    104   <!--=====================================================================-->
    105 
    106   <p>
    107     libc++ is known to work on the following platforms, using g++-4.2 and
    108     clang (lack of C++11 language support disables some functionality). Note
    109     that functionality provided by &lt;atomic&gt; is only functional with
    110     clang.
    111   </p>
    112 
    113   <ul>
    114     <li>Mac OS X i386</li>
    115     <li>Mac OS X x86_64</li>
    116     <li>FreeBSD 10+ i386</li>
    117     <li>FreeBSD 10+ x86_64</li>
    118     <li>FreeBSD 10+ ARM</li>
    119   </ul>
    120 
    121   <!--=====================================================================-->
    122   <h2 id="dir-structure">Current Status</h2>
    123   <!--=====================================================================-->
    124 
    125    <p>libc++ is a 100% complete C++11 implementation on Apple's OS X. </p>
    126    <p>LLVM and Clang can self host in C++ and C++11 mode with libc++ on Linux.</p>
    127    <p>libc++ is also a 100% complete C++14 implementation. A list of new features and changes for
    128       C++14 can be found <a href="cxx1y_status.html">here</a>.</p>
    129    <p>A list of features and changes for the next C++ standard, known here as
    130       "C++1z" (probably to be C++17) can be found <a href="cxx1z_status.html">here</a>.</p>
    131    <p>Implementation of the post-c++14 Technical Specifications is in progress. A list of features and
    132       the current status of these features can be found <a href="ts1z_status.html">here</a>.</p>
    133    <p>
    134    Ports to other platforms are underway. Here are recent test
    135    results for <a href="results.Windows.html">Windows</a>
    136    and <a href="results.Linux.html">Linux</a>.
    137    </p>
    138 
    139    <!--======================================================================-->
    140    <h2 id="buildbots">Build Bots</h2>
    141    <!--======================================================================-->
    142    <p>The latest libc++ build results can be found at the following locations.</p>
    143    <ul>
    144       <li><a href="http://lab.llvm.org:8011/console">
    145         Buildbot libc++ builders
    146       </a></li>
    147       <li><a href="http://lab.llvm.org:8080/green/view/Libcxx/">
    148         Jenkins libc++ builders
    149       </a></li>
    150     </ul>
    151 
    152   <!--=====================================================================-->
    153   <h2>Get it and get involved!</h2>
    154   <!--=====================================================================-->
    155 
    156   <p>First please review our
    157      <a href="http://llvm.org/docs/DeveloperPolicy.html">Developer's Policy</a>.
    158 
    159   <p>
    160      On Mac OS 10.7 (Lion) and later, the easiest way to get this library is to install
    161      Xcode 4.2 or later.  However if you want to install tip-of-trunk from here
    162      (getting the bleeding edge), read on.  However, be warned that Mac OS
    163      10.7 will not boot without a valid copy of <code>libc++.1.dylib</code> in
    164      <code>/usr/lib</code>.
    165   </p>
    166 
    167   <p>To check out the code, use:</p>
    168 
    169   <ul>
    170   <li><code>svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx</code></li>
    171   </ul>
    172 
    173   <p>
    174     Note that for an in-tree build, you should check out libcxx to
    175     llvm/projects.
    176   </p>
    177 
    178   <p>
    179     The following instructions are for building libc++ on FreeBSD, Linux, or Mac
    180     using <a href="http://libcxxabi.llvm.org/">libc++abi</a> as the C++ ABI
    181     library. On Linux, it is also possible to use
    182     <a href="#libsupcxx">libsupc++</a> or <a href="#libcxxrt">libcxxrt</a>.
    183   </p>
    184 
    185   <p>In-tree build:</p>
    186   <ul>
    187     <li><code>cd where-you-want-to-live</code></li>
    188     <li>Check out libcxx and <a href="http://libcxxabi.llvm.org/">libcxxabi</a>
    189       into llvm/projects</li>
    190     <li><code>cd where-you-want-to-build</code></li>
    191     <li><code>mkdir build &amp;&amp; cd build</code></li>
    192     <li><code>cmake path/to/llvm # Linux may require -DCMAKE_C_COMPILER=clang
    193         -DCMAKE_CXX_COMPILER=clang++</code></li>
    194     <li><code>make cxx</code></li>
    195   </ul>
    196 
    197   <p>Out-of-tree buildc:</p>
    198   <ul>
    199     <li><code>cd where-you-want-to-live</code></li>
    200     <li>Check out libcxx and llvm</li>
    201     <li>If not on a Mac, also check out
    202       <a href="http://libcxxabi.llvm.org/">libcxxabi</a></li>
    203     <li><code>cd where-you-want-to-build</code></li>
    204     <li><code>mkdir build &amp;&amp; cd build</code></li>
    205     <li><code>cmake -DLLVM_PATH=path/to/llvm
    206         -DLIBCXX_CXX_ABI=libcxxabi
    207         -DLIBCXX_CXX_ABI_INCLUDE_PATHS=path/to/libcxxabi/include
    208         -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
    209         path/to/libcxx
    210     </code></li>
    211     <li><code>make</code></li>
    212   </ul>
    213 
    214   <p>To run the tests:</p>
    215   <ul>
    216   <li><code>make check-libcxx</code></li>
    217   </ul>
    218 
    219   <p>If you wish to run a subset of the test suite:</p>
    220   <ul>
    221     <li><code>cd path/to/libcxx/libcxx</code></li>
    222     <li><code>alias lit='python path/to/llvm/utils/lit/lit.py'</code></li>
    223     <li><code>export
    224         LIBCXX_SITE_CONFIG=path/to/build/dir/projects/libcxx/test/lit.site.cfg
    225         </code></li>
    226     <li><code>lit -sv test/re/ # or whichever subset of tests you're interested
    227         in</code></li>
    228   </ul>
    229   <p>The above is currently quite inconvenient. Sorry! We're working on it!</p>
    230 
    231   <p>More information on using LIT can be found
    232     <a href="http://llvm.org/docs/CommandGuide/lit.html">here</a>. For more
    233     general information about the LLVM testing infrastructure, see the
    234     <a href="http://llvm.org/docs/TestingGuide.html">LLVM Testing Infrastructure
    235       Guide</a>
    236   </p>
    237 
    238   <p>
    239     Shared libraries for libc++ should now be present in llvm/build/lib. Note
    240     that it is safest to use this from its current location rather than
    241     replacing your system's libc++ (if it has one, if not, go right ahead).
    242   </p>
    243 
    244   <p>
    245     Mac users, remember to be careful when replacing the system's libc++.
    246     <strong>Your system will not be able to boot without a functioning
    247     libc++.</strong>
    248   </p>
    249 
    250   <!--=====================================================================-->
    251   <h3>Notes and Known Issues</h3>
    252   <!--=====================================================================-->
    253 
    254   <p>
    255     <ul>
    256       <li>
    257         Building libc++ with <code>-fno-rtti</code> is not supported. However
    258         linking against it with <code>-fno-rtti</code> is supported.
    259       </li>
    260       <li>
    261         On OS X v10.8 and older the CMake option
    262         <code>-DLIBCXX_LIBCPPABI_VERSION=""</code> must be used during
    263         configuration.
    264       </li>
    265     </ul>
    266   </p>
    267 
    268   <p>Send discussions to the
    269     <a href="http://lists.llvm.org/mailman/listinfo/cfe-dev">clang mailing list</a>.</p>
    270 
    271   <!--=====================================================================-->
    272   <h2>Using libc++ in your programs</h2>
    273   <!--=====================================================================-->
    274 
    275   <!--=====================================================================-->
    276   <h3>FreeBSD and Mac OS X</h3>
    277   <!--=====================================================================-->
    278 
    279   <p>
    280     To use your system-installed libc++ with clang you can:
    281   </p>
    282 
    283   <ul>
    284     <li><code>clang++ -stdlib=libc++ test.cpp</code></li>
    285     <li><code>clang++ -std=c++11 -stdlib=libc++ test.cpp</code></li>
    286   </ul>
    287 
    288   <p>
    289     To use your tip-of-trunk libc++ on Mac OS with clang you can:
    290   </p>
    291 
    292   <ul>
    293     <li><code>export DYLD_LIBRARY_PATH=path/to/build/lib</code>
    294     <li><code>clang++ -std=c++11 -stdlib=libc++ -nostdinc++
    295          -I&lt;path-to-libcxx&gt;/include -L&lt;path-to-libcxx&gt;/lib
    296          test.cpp</code></li>
    297   </ul>
    298 
    299   <!--=====================================================================-->
    300   <h3>Linux</h3>
    301   <!--=====================================================================-->
    302 
    303   <p>
    304     You will need to keep the source tree of
    305     <a href="http://libcxxabi.llvm.org">libc++abi</a> available on your build
    306     machine and your copy of the libc++abi shared library must be placed where
    307     your linker will find it.
    308   </p>
    309 
    310   <p>
    311     Unfortunately you can't simply run clang with "-stdlib=libc++" at this
    312     point, as clang is set up to link for libc++ linked to libsupc++.  To get
    313     around this you'll have to set up your linker yourself (or patch clang).
    314     For example:
    315   </p>
    316 
    317   <ul>
    318     <li><code>clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc</code></li>
    319   </ul>
    320 
    321   <p>
    322     Alternately, you could just add libc++abi to your libraries list, which in
    323     most situations will give the same result:
    324   </p>
    325 
    326   <ul>
    327     <li><code>clang++ -stdlib=libc++ helloworld.cpp -lc++abi</code></li>
    328   </ul>
    329 
    330   <!--=====================================================================-->
    331   <h2>Bug reports and patches</h2>
    332   <!--=====================================================================-->
    333 
    334   <p>
    335   If you think you've found a bug in libc++, please report it using
    336   the <a href="http://llvm.org/bugs">LLVM Bugzilla</a>. If you're not sure, you
    337   can post a message to the <a href="http://lists.llvm.org/mailman/listinfo/cfe-dev">cfe-dev</a> 
    338   mailing list or on IRC. Please include "libc++" in your subject.
    339   </p>
    340 
    341   <p>
    342   If you want to contribute a patch to libc++, the best place for that is
    343   <a href="http://llvm.org/docs/Phabricator.html">Phabricator</a>. Please
    344   include [libc++] in the subject and add cfe-commits as a subscriber.
    345   </p>
    346 
    347   <!--=====================================================================-->
    348   <h2 id="libsupcxx">Build on Linux using CMake and libsupc++.</h2>
    349   <!--=====================================================================-->
    350 
    351   <p>
    352      You will need libstdc++ in order to provide libsupc++.
    353   </p>
    354 
    355   <p>
    356      Figure out where the libsupc++ headers are on your system. On Ubuntu this
    357      is <code>/usr/include/c++/&lt;version&gt;</code> and
    358      <code>/usr/include/c++/&lt;version&gt;/&lt;target-triple&gt;</code>
    359   </p>
    360 
    361   <p>
    362      You can also figure this out by running
    363      <pre>
    364 $ echo | g++ -Wp,-v -x c++ - -fsyntax-only
    365 ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    366 ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
    367 #include "..." search starts here:
    368 #include &lt;...&gt; search starts here:
    369  /usr/include/c++/4.7
    370  /usr/include/c++/4.7/x86_64-linux-gnu
    371  /usr/include/c++/4.7/backward
    372  /usr/lib/gcc/x86_64-linux-gnu/4.7/include
    373  /usr/local/include
    374  /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
    375  /usr/include/x86_64-linux-gnu
    376  /usr/include
    377 End of search list.
    378      </pre>
    379 
    380       Note the first two entries happen to be what we are looking for. This
    381       may not be correct on other platforms.
    382   </p>
    383 
    384   <p>
    385      We can now run CMake:
    386      <ul>
    387        <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles"
    388                 -DLIBCXX_CXX_ABI=libstdc++
    389                 -DLIBCXX_CXX_ABI_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/"
    390                 -DCMAKE_BUILD_TYPE=Release
    391                 -DCMAKE_INSTALL_PREFIX=/usr
    392                 &lt;libc++-source-dir&gt;</code></li>
    393        <li>You can also substitute <code>-DLIBCXX_CXX_ABI=libsupc++</code>
    394        above, which will cause the library to be linked to libsupc++ instead
    395        of libstdc++, but this is only recommended if you know that you will
    396        never need to link against libstdc++ in the same executable as libc++.
    397        GCC ships libsupc++ separately but only as a static library.  If a
    398        program also needs to link against libstdc++, it will provide its
    399        own copy of libsupc++ and this can lead to subtle problems.
    400        <li><code>make</code></li>
    401        <li><code>sudo make install</code></li>
    402      </ul>
    403      <p>
    404         You can now run clang with -stdlib=libc++.
    405      </p>
    406   </p>
    407 
    408   <!--=====================================================================-->
    409   <h2 id="libcxxrt">Build on Linux using CMake and libcxxrt.</h2>
    410   <!--=====================================================================-->
    411 
    412   <p>
    413      You will need to keep the source tree of
    414      <a href="https://github.com/pathscale/libcxxrt/">libcxxrt</a> available
    415      on your build machine and your copy of the libcxxrt shared library must
    416      be placed where your linker will find it.
    417   </p>
    418 
    419   <p>
    420      We can now run CMake:
    421      <ul>
    422        <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles"
    423                 -DLIBCXX_CXX_ABI=libcxxrt
    424                 -DLIBCXX_CXX_ABI_INCLUDE_PATHS="&lt;libcxxrt-source-dir&gt;/src"
    425                 -DCMAKE_BUILD_TYPE=Release
    426                 -DCMAKE_INSTALL_PREFIX=/usr
    427                 &lt;libc++-source-dir&gt;</code></li>
    428        <li><code>make</code></li>
    429        <li><code>sudo make install</code></li>
    430      </ul>
    431      <p>
    432         Unfortunately you can't simply run clang with "-stdlib=libc++" at this point, as
    433         clang is set up to link for libc++ linked to libsupc++.  To get around this
    434         you'll have to set up your linker yourself (or patch clang).  For example,
    435         <ul>
    436           <li><code>clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lcxxrt -lm -lc -lgcc_s -lgcc</code></li>
    437         </ul>
    438         Alternately, you could just add libcxxrt to your libraries list, which in most
    439         situations will give the same result:
    440         <ul>
    441           <li><code>clang++ -stdlib=libc++ helloworld.cpp -lcxxrt</code></li>
    442         </ul>
    443      </p>
    444   </p>
    445 
    446   <!--=====================================================================-->
    447   <h2 id="local-abi">Using a local ABI library</h2>
    448   <!--=====================================================================-->
    449   <p>
    450     <strong>Note: This is not recommended in almost all cases.</strong><br>
    451     Generally these instructions should only be used when you can't install
    452     your ABI library.
    453   </p>
    454   <p>
    455     Normally you must link libc++ against a ABI shared library that the
    456     linker can find.  If you want to build and test libc++ against an ABI
    457     library not in the linker's path you need to set
    458     <code>-DLIBCXX_CXX_ABI_LIBRARY_PATH=/path/to/abi/lib</code> when
    459     configuring CMake.
    460   </p>
    461   <p>
    462     An example build using libc++abi would look like:
    463     <ul>
    464     <li><code>CC=clang CXX=clang++ cmake
    465               -DLIBCXX_CXX_ABI=libc++abi
    466               -DLIBCXX_CXX_ABI_INCLUDE_PATHS="/path/to/libcxxabi/include"
    467               -DLIBCXX_CXX_ABI_LIBRARY_PATH="/path/to/libcxxabi-build/lib"
    468               path/to/libcxx</code></li>
    469     <li><code>make</code></li>
    470     </ul>
    471   </p>
    472   <p>
    473     When testing libc++ LIT will automatically link against the proper ABI
    474     library.
    475   </p>
    476 
    477   <!--=====================================================================-->
    478   <h2>Design Documents</h2>
    479   <!--=====================================================================-->
    480 
    481 <ul>
    482 <li><a href="atomic_design.html"><tt>&lt;atomic&gt;</tt></a></li>
    483 <li><a href="type_traits_design.html"><tt>&lt;type_traits&gt;</tt></a></li>
    484 <li><a href="http://cplusplusmusings.wordpress.com/2012/07/05/clang-and-standard-libraries-on-mac-os-x/">Excellent notes by Marshall Clow</a></li>
    485 <li><a href="debug_mode.html">Status of debug mode</a></li>
    486 <li><a href="lit_usage.html">LIT usage guide</a></li>
    487 </ul>
    488 
    489 </div>
    490 </body>
    491 </html>
    492