Home | History | Annotate | Download | only in docs
      1 ============
      2 Using libc++
      3 ============
      4 
      5 .. contents::
      6   :local:
      7 
      8 Getting Started
      9 ===============
     10 
     11 If you already have libc++ installed you can use it with clang.
     12 
     13 .. code-block:: bash
     14 
     15     $ clang++ -stdlib=libc++ test.cpp
     16     $ clang++ -std=c++11 -stdlib=libc++ test.cpp
     17 
     18 On OS X and FreeBSD libc++ is the default standard library
     19 and the ``-stdlib=libc++`` is not required.
     20 
     21 .. _alternate libcxx:
     22 
     23 If you want to select an alternate installation of libc++ you
     24 can use the following options.
     25 
     26 .. code-block:: bash
     27 
     28   $ clang++ -std=c++11 -stdlib=libc++ -nostdinc++ \
     29             -I<libcxx-install-prefix>/include/c++/v1 \
     30             -L<libcxx-install-prefix>/lib \
     31             -Wl,-rpath,<libcxx-install-prefix>/lib \
     32             test.cpp
     33 
     34 The option ``-Wl,-rpath,<libcxx-install-prefix>/lib`` adds a runtime library
     35 search path. Meaning that the systems dynamic linker will look for libc++ in
     36 ``<libcxx-install-prefix>/lib`` whenever the program is run. Alternatively the
     37 environment variable ``LD_LIBRARY_PATH`` (``DYLD_LIBRARY_PATH`` on OS X) can
     38 be used to change the dynamic linkers search paths after a program is compiled.
     39 
     40 An example of using ``LD_LIBRARY_PATH``:
     41 
     42 .. code-block:: bash
     43 
     44   $ clang++ -stdlib=libc++ -nostdinc++ \
     45             -I<libcxx-install-prefix>/include/c++/v1
     46             -L<libcxx-install-prefix>/lib \
     47             test.cpp -o
     48   $ ./a.out # Searches for libc++ in the systems library paths.
     49   $ export LD_LIBRARY_PATH=<libcxx-install-prefix>/lib
     50   $ ./a.out # Searches for libc++ along LD_LIBRARY_PATH
     51 
     52 Using libc++experimental and ``<experimental/...>``
     53 =====================================================
     54 
     55 Libc++ provides implementations of experimental technical specifications
     56 in a separate library, ``libc++experimental.a``. Users of ``<experimental/...>``
     57 headers may be required to link ``-lc++experimental``.
     58 
     59 .. code-block:: bash
     60 
     61   $ clang++ -std=c++14 -stdlib=libc++ test.cpp -lc++experimental
     62 
     63 Libc++experimental.a may not always be available, even when libc++ is already
     64 installed. For information on building libc++experimental from source see
     65 :ref:`Building Libc++ <build instructions>` and
     66 :ref:`libc++experimental CMake Options <libc++experimental options>`.
     67 
     68 Also see the `Experimental Library Implementation Status <http://libcxx.llvm.org/ts1z_status.html>`__
     69 page.
     70 
     71 .. warning::
     72   Experimental libraries are Experimental.
     73     * The contents of the ``<experimental/...>`` headers and ``libc++experimental.a``
     74       library will not remain compatible between versions.
     75     * No guarantees of API or ABI stability are provided.
     76 
     77 Using libc++ on Linux
     78 =====================
     79 
     80 On Linux libc++ can typically be used with only '-stdlib=libc++'. However
     81 some libc++ installations require the user manually link libc++abi themselves.
     82 If you are running into linker errors when using libc++ try adding '-lc++abi'
     83 to the link line.  For example:
     84 
     85 .. code-block:: bash
     86 
     87   $ clang++ -stdlib=libc++ test.cpp -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
     88 
     89 Alternately, you could just add libc++abi to your libraries list, which in
     90 most situations will give the same result:
     91 
     92 .. code-block:: bash
     93 
     94   $ clang++ -stdlib=libc++ test.cpp -lc++abi
     95 
     96 
     97 Using libc++ with GCC
     98 ---------------------
     99 
    100 GCC does not provide a way to switch from libstdc++ to libc++. You must manually
    101 configure the compile and link commands.
    102 
    103 In particular you must tell GCC to remove the libstdc++ include directories
    104 using ``-nostdinc++`` and to not link libstdc++.so using ``-nodefaultlibs``.
    105 
    106 Note that ``-nodefaultlibs`` removes all of the standard system libraries and
    107 not just libstdc++ so they must be manually linked. For example:
    108 
    109 .. code-block:: bash
    110 
    111   $ g++ -nostdinc++ -I<libcxx-install-prefix>/include/c++/v1 \
    112          test.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
    113 
    114 
    115 GDB Pretty printers for libc++
    116 ------------------------------
    117 
    118 GDB does not support pretty-printing of libc++ symbols by default. Unfortunately
    119 libc++ does not provide pretty-printers itself. However there are 3rd
    120 party implementations available and although they are not officially
    121 supported by libc++ they may be useful to users.
    122 
    123 Known 3rd Party Implementations Include:
    124 
    125 * `Koutheir's libc++ pretty-printers <https://github.com/koutheir/libcxx-pretty-printers>`_.
    126