1d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant          "http://www.w3.org/TR/html4/strict.dtd">
3bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<html>
5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<head>
6bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <title>"libc++" C++ Standard Library</title>
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <link type="text/css" rel="stylesheet" href="menu.css">
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <link type="text/css" rel="stylesheet" href="content.css">
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</head>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<body>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<div id="menu">
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <div>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <a href="http://llvm.org/">LLVM Home</a>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </div>
17d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <div class="submenu">
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <label>libc++ Info</label>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <a href="/index.html">About</a>
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </div>
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <div class="submenu">
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <label>Quick Links</label>
25a535ffd99d3702ab065647e28e83c2b7d720be3dChris Lattner    <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a>
26a535ffd99d3702ab065647e28e83c2b7d720be3dChris Lattner    <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a>
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <a href="http://llvm.org/bugs/">Bug Reports</a>
2876e1ffc6036a7e772827228e4626280caddbc354Howard Hinnant    <a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a>
2976e1ffc6036a7e772827228e4626280caddbc354Howard Hinnant    <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a>
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </div>
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</div>
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant<div id="content">
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--*********************************************************************-->
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h1>"libc++" C++ Standard Library</h1>
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--*********************************************************************-->
37d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <p>libc++ is a new implementation of the C++ standard library, targeting
39af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant     C++11.</p>
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
41f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner  <p>All of the code in libc++ is <a
42f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner     href="http://llvm.org/docs/DeveloperPolicy.html#license">dual licensed</a>
43f38bc6efc52ff2c773582d5b62dd53aaa92c186cChris Lattner     under the MIT license and the UIUC License (a BSD-like license).</p>
44d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2 id="goals">Features and Goals</h2>
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
48d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <ul>
50af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant        <li>Correctness as defined by the C++11 standard.</li>
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Fast execution.</li>
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Minimal memory use.</li>
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Fast compile times.</li>
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>ABI compatibility with gcc's libstdc++ for some low-level features
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            such as exception objects, rtti and memory allocation.</li>
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        <li>Extensive unit tests.</li>
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    </ul>
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
60faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow  <h2 id="why">Why a new C++ Standard Library for C++11?</h2>
6124173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <!--=====================================================================-->
62d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
6324173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <p>After its initial introduction, many people have asked "why start a new
6424173b81dd527a38b32e037082f7d1578213d626Chris Lattner     library instead of contributing to an existing library?" (like Apache's
6524173b81dd527a38b32e037082f7d1578213d626Chris Lattner     libstdcxx, GNU's libstdc++, STLport, etc).  There are many contributing
6624173b81dd527a38b32e037082f7d1578213d626Chris Lattner     reasons, but some of the major ones are:</p>
67d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
6824173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <ul>
6924173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <li><p>From years of experience (including having implemented the standard
7024173b81dd527a38b32e037082f7d1578213d626Chris Lattner      library before), we've learned many things about implementing
7124173b81dd527a38b32e037082f7d1578213d626Chris Lattner      the standard containers which require ABI breakage and fundamental changes
7224173b81dd527a38b32e037082f7d1578213d626Chris Lattner      to how they are implemented.  For example, it is generally accepted that
7324173b81dd527a38b32e037082f7d1578213d626Chris Lattner      building std::string using the "short string optimization" instead of
7424173b81dd527a38b32e037082f7d1578213d626Chris Lattner      using Copy On Write (COW) is a superior approach for multicore
75faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow      machines (particularly in C++11, which has rvalue references).  Breaking
76a5058d9a0d5e60adcd9118dfe7f886effd6a6206Chris Lattner      ABI compatibility with old versions of the library was
7724173b81dd527a38b32e037082f7d1578213d626Chris Lattner      determined to be critical to achieving the performance goals of
7824173b81dd527a38b32e037082f7d1578213d626Chris Lattner      libc++.</p></li>
79d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
8024173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <li><p>Mainline libstdc++ has switched to GPL3, a license which the developers
8124173b81dd527a38b32e037082f7d1578213d626Chris Lattner      of libc++ cannot use.  libstdc++ 4.2 (the last GPL2 version) could be
82faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow      independently extended to support C++11, but this would be a fork of the
83f33824922812487c1e7f24852975b0e06792eb7eChris Lattner      codebase (which is often seen as worse for a project than starting a new
84f33824922812487c1e7f24852975b0e06792eb7eChris Lattner      independent one).  Another problem with libstdc++ is that it is tightly
85f33824922812487c1e7f24852975b0e06792eb7eChris Lattner       integrated with G++ development, tending to be tied fairly closely to the
86f33824922812487c1e7f24852975b0e06792eb7eChris Lattner       matching version of G++.</p>
8724173b81dd527a38b32e037082f7d1578213d626Chris Lattner    </li>
8824173b81dd527a38b32e037082f7d1578213d626Chris Lattner
8924173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <li><p>STLport and the Apache libstdcxx library are two other popular
90faa17162e91c615378c38d7dc4a22699cf4cf0cfMarshall Clow      candidates, but both lack C++11 support.  Our experience (and the
91af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant      experience of libstdc++ developers) is that adding support for C++11 (in
9224173b81dd527a38b32e037082f7d1578213d626Chris Lattner      particular rvalue references and move-only types) requires changes to
9324173b81dd527a38b32e037082f7d1578213d626Chris Lattner      almost every class and function, essentially amounting to a rewrite.
94bfa808e093b1bd53832a9aa245d27b1b95827bbfChris Lattner      Faced with a rewrite, we decided to start from scratch and evaluate every
95bfa808e093b1bd53832a9aa245d27b1b95827bbfChris Lattner      design decision from first principles based on experience.</p>
96d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
9724173b81dd527a38b32e037082f7d1578213d626Chris Lattner      <p>Further, both projects are apparently abandoned: STLport 5.2.1 was
9824173b81dd527a38b32e037082f7d1578213d626Chris Lattner      released in Oct'08, and STDCXX 4.2.1 in May'08.</p>
9924173b81dd527a38b32e037082f7d1578213d626Chris Lattner
10024173b81dd527a38b32e037082f7d1578213d626Chris Lattner    </ul>
10124173b81dd527a38b32e037082f7d1578213d626Chris Lattner
10224173b81dd527a38b32e037082f7d1578213d626Chris Lattner  <!--=====================================================================-->
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2 id="requirements">Platform Support</h2>
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant   <p>libc++ is known to work on the following platforms, using g++-4.2 and
107af3473404e13e758ac482a1fd59d7dad2bb0d612Howard Hinnant      clang (lack of C++11 language support disables some functionality).</p>
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    <ul>
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant     <li>Mac OS X i386</li>
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant     <li>Mac OS X x86_64</li>
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    </ul>
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2 id="dir-structure">Current Status</h2>
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
118b0895ff8aee82d79986e1cc61e66870d48244d90Howard Hinnant   <p>libc++ is a 100% complete C++11 implementation on Apple's OS X. </p>
119db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer   <p>LLVM and Clang can self host in C++ and C++11 mode with libc++ on Linux.</p>
1205d4807742fbc1ee738ac5edc7fec98aef087949dMarshall Clow   <p>C++1Y (C++14) implementation is in progress. The current status is
121437cdcf8133bc69af86cf66282811af9e20ccd00Marshall Clow       <a href="cxx1y_status.html">here</a></p>
1225d4807742fbc1ee738ac5edc7fec98aef087949dMarshall Clow 
1230cbb3a16e258e2cebcb827af310ffe43ecaee508Howard Hinnant   <p>
124ee7a0bf265499a87948e152e9d3a1bedcb9e896cHoward Hinnant   Ports to other platforms are underway. Here are recent test
125ee7a0bf265499a87948e152e9d3a1bedcb9e896cHoward Hinnant   results for <a href="results.Windows.html">Windows</a>
126ee7a0bf265499a87948e152e9d3a1bedcb9e896cHoward Hinnant   and <a href="results.Linux.html">Linux</a>.
1270cbb3a16e258e2cebcb827af310ffe43ecaee508Howard Hinnant   </p>
1280cbb3a16e258e2cebcb827af310ffe43ecaee508Howard Hinnant
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <h2>Get it and get involved!</h2>
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <!--=====================================================================-->
132d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
1332481cba8b7eb98b939a0b36d85f552917a63816dHoward Hinnant  <p>First please review our
1342481cba8b7eb98b939a0b36d85f552917a63816dHoward Hinnant     <a href="http://llvm.org/docs/DeveloperPolicy.html">Developer's Policy</a>.
1352481cba8b7eb98b939a0b36d85f552917a63816dHoward Hinnant
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <p>To check out the code, use:</p>
137d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <ul>
1394b748953a2d51c34127aa9c593477966242e1898Chris Lattner  <li><code>svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx</code></li>
14065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </ul>
14165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
142704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant  <p>
14322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant     On Mac OS 10.7 (Lion) and later, the easiest way to get this library is to install
144704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant     Xcode 4.2 or later.  However if you want to install tip-of-trunk from here
145271a1c03c309f20bb8cdbb0b0af7ad563bdc866dHoward Hinnant     (getting the bleeding edge), read on.  However, be warned that Mac OS
146271a1c03c309f20bb8cdbb0b0af7ad563bdc866dHoward Hinnant     10.7 will not boot without a valid copy of <code>libc++.1.dylib</code> in
147271a1c03c309f20bb8cdbb0b0af7ad563bdc866dHoward Hinnant     <code>/usr/lib</code>.
148704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant  </p>
149704f09b21245cee8a775fdb9962ed40de0f94b04Howard Hinnant
15065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>
15165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant     Next:
15265451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </p>
15365451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  
15465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <ul>
15565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>cd libcxx/lib</code></li>
15665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>export TRIPLE=-apple-</code></li>
15765451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant    <li><code>/buildit</code></li>
15822b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    <li><code>ln -sf libc++.1.dylib libc++.dylib</code></li>
15965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </ul>
16065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  
16165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>
16222b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant     That should result in a libc++.1.dylib and libc++.dylib.  The safest thing
16322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant     to do is to use it from where your libcxx is installed instead of replacing
16422b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant     these in your Mac OS.
16522b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant  </p>
16622b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant
16722b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant  <p>
16822b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant  To use your system-installed libc++ with clang you can:
16965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </p>
17065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
17165451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <ul>
17222b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    <li><code>clang++ -stdlib=libc++ test.cpp</code></li>
17322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    <li><code>clang++ -std=c++11 -stdlib=libc++ test.cpp</code></li>
17465451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </ul>
17565451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
17665451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <p>
17722b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant  To use your tip-of-trunk libc++ on Mac OS with clang you can:
17865451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  </p>
17965451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant
18065451f15493a16a541d82f0591ba27506f2793b1Howard Hinnant  <ul>
18122b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    <li><code>export DYLD_LIBRARY_PATH=&lt;path-to-libcxx&gt;/lib</code>
18222b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant    <li><code>clang++ -std=c++11 -stdlib=libc++ -nostdinc++
18322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant         -I&lt;path-to-libcxx&gt;/include -L&lt;path-to-libcxx&gt;/lib
18422b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant         test.cpp</code></li>
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </ul>
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18708a0b48c094ae76c3c9fb082bf0f17738a3fd7ceMarshall Clow  <p>To run the libc++ test suite (recommended):</p>
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <ul>
1904b748953a2d51c34127aa9c593477966242e1898Chris Lattner  <li><code>cd libcxx/test</code></li>
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  <li><code>/testit</code></li>
192f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant     <ul>
19322b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant       <li>You can alter the command line options <code>testit</code> uses
19422b781bf0c49857e1d0e2f1873cf8c3869e8246bHoward Hinnant       with <code>export OPTIONS="whatever you need"</code></li>
195f5d76a7afce1d593634004566066c8e593a14adeHoward Hinnant     </ul>
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant  </ul>
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
19851065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant  <!--=====================================================================-->
19951065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant  <h3>Notes</h3>
20051065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant  <!--=====================================================================-->
20151065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant
20251065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant<p>
20351065657aa5d421b8e41d16d66da707a7237adb0Howard HinnantBuilding libc++ with <code>-fno-rtti</code> is not supported.  However linking
20451065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnantagainst it with <code>-fno-rtti</code> is supported.
20551065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant</p>
20651065657aa5d421b8e41d16d66da707a7237adb0Howard Hinnant
207d2bb03207523e55aa2423570bcaaad03e779450cHoward Hinnant  <p>Send discussions to the
2088c21737c03f3b266d8679d56faa6b6d091e7f2f1Howard Hinnant  (<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">clang mailing list</a>).</p>
2098c21737c03f3b266d8679d56faa6b6d091e7f2f1Howard Hinnant
21056f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant  <!--=====================================================================-->
211db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <h2>Build on Linux using CMake and libsupc++.</h2>
212db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <!--=====================================================================-->
213db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
214db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <p>
215db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     You will need libstdc++ in order to provide libsupc++.
216db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  </p>
217db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  
218db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <p>
219db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     Figure out where the libsupc++ headers are on your system. On Ubuntu this
220db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     is <code>/usr/include/c++/&lt;version&gt;</code> and
221db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     <code>/usr/include/c++/&lt;version&gt;/&lt;target-triple&gt;</code>
222db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  </p>
223db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  
224db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <p>
225db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     You can also figure this out by running
226db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     <pre>
227db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer$ echo | g++ -Wp,-v -x c++ - -fsyntax-only
228db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
229db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencerignoring nonexistent directory "/usr/x86_64-linux-gnu/include"
230db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer#include "..." search starts here:
231db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer#include &lt;...&gt; search starts here:
232db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/include/c++/4.7
233db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/include/c++/4.7/x86_64-linux-gnu
234db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/include/c++/4.7/backward
235db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/lib/gcc/x86_64-linux-gnu/4.7/include
236db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/local/include
237db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
238db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/include/x86_64-linux-gnu
239db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer /usr/include
240db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. SpencerEnd of search list.
241db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     </pre>
242db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
243db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer      Note the first two entries happen to be what we are looking for. This
244db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer      may not be correct on other platforms.
245db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  </p>
246db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  
247db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <p>
248db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     We can now run CMake:
249db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     <ul>
250db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer       <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles"
251d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne                -DLIBCXX_CXX_ABI=libstdc++
252db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer                -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/"
253db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer                -DCMAKE_BUILD_TYPE=Release
254db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer                -DCMAKE_INSTALL_PREFIX=/usr
255db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer                &lt;libc++-source-dir&gt;</code></li>
256d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       <li>You can also substitute <code>-DLIBCXX_CXX_ABI=libsupc++</code>
257d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       above, which will cause the library to be linked to libsupc++ instead
258d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       of libstdc++, but this is only recommended if you know that you will
259d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       never need to link against libstdc++ in the same executable as libc++.
260d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       GCC ships libsupc++ separately but only as a static library.  If a
261d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       program also needs to link against libstdc++, it will provide its
262d0d308f54baaa977292b6ea586a9577aa6e2a8e4Peter Collingbourne       own copy of libsupc++ and this can lead to subtle problems.
263db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer       <li><code>make</code></li>
264db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer       <li><code>sudo make install</code></li>
265db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     </ul>
266db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     <p>
267db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer        You can now run clang with -stdlib=libc++.
268db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer     </p>
269db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  </p>
270db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer
271db8a030bd3d8260c3def1d7710f34ec0b6ec7a89Michael J. Spencer  <!--=====================================================================-->
272af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <h2>Build on Linux using CMake and libc++abi.</h2>
273af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <!--=====================================================================-->
274af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant
275af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <p>
276af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     You will need to keep the source tree of <a href="http://libcxxabi.llvm.org">libc++abi</a>
277af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     available on your build machine and your copy of the libc++abi shared library must
278af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     be placed where your linker will find it.
279af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  </p>
280af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  
281af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <p>
282af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     We can now run CMake:
283af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     <ul>
284af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant       <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles"
285af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DLIBCXX_CXX_ABI=libcxxabi
286af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="&lt;libc++abi-source-dir&gt;/include"
287af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DCMAKE_BUILD_TYPE=Release
288af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DCMAKE_INSTALL_PREFIX=/usr
289af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                &lt;libc++-source-dir&gt;</code></li>
290af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant       <li><code>make</code></li>
291af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant       <li><code>sudo make install</code></li>
292af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     </ul>
293af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     <p>
294af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        Unfortunately you can't simply run clang with "-stdlib=libc++" at this point, as
295af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        clang is set up to link for libc++ linked to libsupc++.  To get around this
296af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        you'll have to set up your linker yourself (or patch clang).  For example,
297af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        <ul>
298af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant          <li><code>clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc</code></li>
299af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        </ul>
300af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        Alternately, you could just add libc++abi to your libraries list, which in most
301af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        situations will give the same result:
302af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        <ul>
303af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant          <li><code>clang++ -stdlib=libc++ helloworld.cpp -lc++abi</code></li>
304af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        </ul>
305af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     </p>
306af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  </p>
307af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant
308af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <!--=====================================================================-->
309af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <h2>Build on Linux using CMake and libcxxrt.</h2>
310af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <!--=====================================================================-->
311af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant
312af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <p>
313af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     You will need to keep the source tree of
314af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     <a href="https://github.com/pathscale/libcxxrt/">libcxxrt</a> available
315af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     on your build machine and your copy of the libcxxrt shared library must
316af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     be placed where your linker will find it.
317af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  </p>
318af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant 
319af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <p>
320af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     We can now run CMake:
321af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     <ul>
322af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant       <li><code>CC=clang CXX=clang++ cmake -G "Unix Makefiles"
323af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DLIBCXX_CXX_ABI=libcxxrt
324fae54b9c14d9ec0709103411f162f8286941a601Howard Hinnant                -DLIBCXX_LIBCXXRT_INCLUDE_PATHS="&lt;libcxxrt-source-dir&gt;/src"
325af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DCMAKE_BUILD_TYPE=Release
326af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                -DCMAKE_INSTALL_PREFIX=/usr
327af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant                &lt;libc++-source-dir&gt;</code></li>
328af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant       <li><code>make</code></li>
329af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant       <li><code>sudo make install</code></li>
330af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     </ul>
331af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     <p>
332af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        Unfortunately you can't simply run clang with "-stdlib=libc++" at this point, as
333af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        clang is set up to link for libc++ linked to libsupc++.  To get around this
334af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        you'll have to set up your linker yourself (or patch clang).  For example,
335af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        <ul>
336af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant          <li><code>clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lcxxrt -lm -lc -lgcc_s -lgcc</code></li>
337af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        </ul>
338af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        Alternately, you could just add libcxxrt to your libraries list, which in most
339af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        situations will give the same result:
340af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        <ul>
341af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant          <li><code>clang++ -stdlib=libc++ helloworld.cpp -lcxxrt</code></li>
342af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant        </ul>
343af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant     </p>
344af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  </p>
345af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant
346af4d1619089310f8f292c4240b0e522244a6ce1eHoward Hinnant  <!--=====================================================================-->
34756f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant  <h2>Design Documents</h2>
34856f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant  <!--=====================================================================-->
34956f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant
35056f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant<ul>
35156f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant<li><a href="atomic_design.html"><tt>&lt;atomic&gt;</tt></a></li>
3529835d761695b7d54e7d231dd1fe682597f249349Howard Hinnant<li><a href="type_traits_design.html"><tt>&lt;type_traits&gt;</tt></a></li>
353e47bc9bc4f91fd13f33d69a1199a71acc662e854Marshall Clow<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>
354c7cbe502dbf62acc4168b511d51eb181492950baHoward Hinnant<li><a href="debug_mode.html">Status of debug mode</a></li>
35556f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant</ul>
35656f0d5be064ed82f439e1596a272237697077ec3Howard Hinnant
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</div>
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant</body>
3594b748953a2d51c34127aa9c593477966242e1898Chris Lattner</html>
360