123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- ============
- Using libc++
- ============
- .. contents::
- :local:
- Getting Started
- ===============
- If you already have libc++ installed you can use it with clang.
- .. code-block:: bash
- $ clang++ -stdlib=libc++ test.cpp
- $ clang++ -std=c++11 -stdlib=libc++ test.cpp
- On macOS and FreeBSD libc++ is the default standard library
- and the ``-stdlib=libc++`` is not required.
- .. _alternate libcxx:
- If you want to select an alternate installation of libc++ you
- can use the following options.
- .. code-block:: bash
- $ clang++ -std=c++11 -stdlib=libc++ -nostdinc++ \
- -I<libcxx-install-prefix>/include/c++/v1 \
- -L<libcxx-install-prefix>/lib \
- -Wl,-rpath,<libcxx-install-prefix>/lib \
- test.cpp
- The option ``-Wl,-rpath,<libcxx-install-prefix>/lib`` adds a runtime library
- search path. Meaning that the systems dynamic linker will look for libc++ in
- ``<libcxx-install-prefix>/lib`` whenever the program is run. Alternatively the
- environment variable ``LD_LIBRARY_PATH`` (``DYLD_LIBRARY_PATH`` on macOS) can
- be used to change the dynamic linkers search paths after a program is compiled.
- An example of using ``LD_LIBRARY_PATH``:
- .. code-block:: bash
- $ clang++ -stdlib=libc++ -nostdinc++ \
- -I<libcxx-install-prefix>/include/c++/v1
- -L<libcxx-install-prefix>/lib \
- test.cpp -o
- $ ./a.out # Searches for libc++ in the systems library paths.
- $ export LD_LIBRARY_PATH=<libcxx-install-prefix>/lib
- $ ./a.out # Searches for libc++ along LD_LIBRARY_PATH
- Using ``<filesystem>``
- ======================
- Prior to LLVM 9.0, libc++ provides the implementation of the filesystem library
- in a separate static library. Users of ``<filesystem>`` and ``<experimental/filesystem>``
- are required to link ``-lc++fs``. Prior to libc++ 7.0, users of
- ``<experimental/filesystem>`` were required to link libc++experimental.
- Starting with LLVM 9.0, support for ``<filesystem>`` is provided in the main
- library and nothing special is required to use ``<filesystem>``.
- Using libc++experimental and ``<experimental/...>``
- =====================================================
- Libc++ provides implementations of experimental technical specifications
- in a separate library, ``libc++experimental.a``. Users of ``<experimental/...>``
- headers may be required to link ``-lc++experimental``.
- .. code-block:: bash
- $ clang++ -std=c++14 -stdlib=libc++ test.cpp -lc++experimental
- Libc++experimental.a may not always be available, even when libc++ is already
- installed. For information on building libc++experimental from source see
- :ref:`Building Libc++ <build instructions>` and
- :ref:`libc++experimental CMake Options <libc++experimental options>`.
- Also see the `Experimental Library Implementation Status <http://libcxx.llvm.org/ts1z_status.html>`__
- page.
- .. warning::
- Experimental libraries are Experimental.
- * The contents of the ``<experimental/...>`` headers and ``libc++experimental.a``
- library will not remain compatible between versions.
- * No guarantees of API or ABI stability are provided.
- * When we implement the standardized version of an experimental feature,
- the experimental feature is removed two releases after the non-experimental
- version has shipped. The full policy is explained :ref:`here <experimental features>`.
- Using libc++ on Linux
- =====================
- On Linux libc++ can typically be used with only '-stdlib=libc++'. However
- some libc++ installations require the user manually link libc++abi themselves.
- If you are running into linker errors when using libc++ try adding '-lc++abi'
- to the link line. For example:
- .. code-block:: bash
- $ clang++ -stdlib=libc++ test.cpp -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
- Alternately, you could just add libc++abi to your libraries list, which in
- most situations will give the same result:
- .. code-block:: bash
- $ clang++ -stdlib=libc++ test.cpp -lc++abi
- Using libc++ with GCC
- ---------------------
- GCC does not provide a way to switch from libstdc++ to libc++. You must manually
- configure the compile and link commands.
- In particular you must tell GCC to remove the libstdc++ include directories
- using ``-nostdinc++`` and to not link libstdc++.so using ``-nodefaultlibs``.
- Note that ``-nodefaultlibs`` removes all of the standard system libraries and
- not just libstdc++ so they must be manually linked. For example:
- .. code-block:: bash
- $ g++ -nostdinc++ -I<libcxx-install-prefix>/include/c++/v1 \
- test.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
- GDB Pretty printers for libc++
- ------------------------------
- GDB does not support pretty-printing of libc++ symbols by default. Unfortunately
- libc++ does not provide pretty-printers itself. However there are 3rd
- party implementations available and although they are not officially
- supported by libc++ they may be useful to users.
- Known 3rd Party Implementations Include:
- * `Koutheir's libc++ pretty-printers <https://github.com/koutheir/libcxx-pretty-printers>`_.
- Libc++ Configuration Macros
- ===========================
- Libc++ provides a number of configuration macros which can be used to enable
- or disable extended libc++ behavior, including enabling "debug mode" or
- thread safety annotations.
- **_LIBCPP_DEBUG**:
- See :ref:`using-debug-mode` for more information.
- **_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS**:
- This macro is used to enable -Wthread-safety annotations on libc++'s
- ``std::mutex`` and ``std::lock_guard``. By default these annotations are
- disabled and must be manually enabled by the user.
- **_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS**:
- This macro is used to disable all visibility annotations inside libc++.
- Defining this macro and then building libc++ with hidden visibility gives a
- build of libc++ which does not export any symbols, which can be useful when
- building statically for inclusion into another library.
- **_LIBCPP_DISABLE_EXTERN_TEMPLATE**:
- This macro is used to disable extern template declarations in the libc++
- headers. The intended use case is for clients who wish to use the libc++
- headers without taking a dependency on the libc++ library itself.
- **_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION**:
- This macro is used to re-enable an extension in `std::tuple` which allowed
- it to be implicitly constructed from fewer initializers than contained
- elements. Elements without an initializer are default constructed. For example:
- .. code-block:: cpp
- std::tuple<std::string, int, std::error_code> foo() {
- return {"hello world", 42}; // default constructs error_code
- }
- Since libc++ 4.0 this extension has been disabled by default. This macro
- may be defined to re-enable it in order to support existing code that depends
- on the extension. New use of this extension should be discouraged.
- See `PR 27374 <http://llvm.org/PR27374>`_ for more information.
- Note: The "reduced-arity-initialization" extension is still offered but only
- for explicit conversions. Example:
- .. code-block:: cpp
- auto foo() {
- using Tup = std::tuple<std::string, int, std::error_code>;
- return Tup{"hello world", 42}; // explicit constructor called. OK.
- }
- **_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS**:
- This macro disables the additional diagnostics generated by libc++ using the
- `diagnose_if` attribute. These additional diagnostics include checks for:
- * Giving `set`, `map`, `multiset`, `multimap` and their `unordered_`
- counterparts a comparator which is not const callable.
- * Giving an unordered associative container a hasher that is not const
- callable.
- **_LIBCPP_NO_VCRUNTIME**:
- Microsoft's C and C++ headers are fairly entangled, and some of their C++
- headers are fairly hard to avoid. In particular, `vcruntime_new.h` gets pulled
- in from a lot of other headers and provides definitions which clash with
- libc++ headers, such as `nothrow_t` (note that `nothrow_t` is a struct, so
- there's no way for libc++ to provide a compatible definition, since you can't
- have multiple definitions).
- By default, libc++ solves this problem by deferring to Microsoft's vcruntime
- headers where needed. However, it may be undesirable to depend on vcruntime
- headers, since they may not always be available in cross-compilation setups,
- or they may clash with other headers. The `_LIBCPP_NO_VCRUNTIME` macro
- prevents libc++ from depending on vcruntime headers. Consequently, it also
- prevents libc++ headers from being interoperable with vcruntime headers (from
- the aforementioned clashes), so users of this macro are promising to not
- attempt to combine libc++ headers with the problematic vcruntime headers. This
- macro also currently prevents certain `operator new`/`operator delete`
- replacement scenarios from working, e.g. replacing `operator new` and
- expecting a non-replaced `operator new[]` to call the replaced `operator new`.
- **_LIBCPP_ENABLE_NODISCARD**:
- Allow the library to add ``[[nodiscard]]`` attributes to entities not specified
- as ``[[nodiscard]]`` by the current language dialect. This includes
- backporting applications of ``[[nodiscard]]`` from newer dialects and
- additional extended applications at the discretion of the library. All
- additional applications of ``[[nodiscard]]`` are disabled by default.
- See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for
- more information.
- **_LIBCPP_DISABLE_NODISCARD_EXT**:
- This macro prevents the library from applying ``[[nodiscard]]`` to entities
- purely as an extension. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>`
- for more information.
- **_LIBCPP_DISABLE_DEPRECATION_WARNINGS**:
- This macro disables warnings when using deprecated components. For example,
- using `std::auto_ptr` when compiling in C++11 mode will normally trigger a
- warning saying that `std::auto_ptr` is deprecated. If the macro is defined,
- no warning will be emitted. By default, this macro is not defined.
- C++17 Specific Configuration Macros
- -----------------------------------
- **_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES**:
- This macro is used to re-enable all the features removed in C++17. The effect
- is equivalent to manually defining each macro listed below.
- **_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS**:
- This macro is used to re-enable the `set_unexpected`, `get_unexpected`, and
- `unexpected` functions, which were removed in C++17.
- **_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR**:
- This macro is used to re-enable `std::auto_ptr` in C++17.
- C++2a Specific Configuration Macros:
- ------------------------------------
- **_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17**:
- This macro can be used to disable diagnostics emitted from functions marked
- ``[[nodiscard]]`` in dialects after C++17. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>`
- for more information.
- Libc++ Extensions
- =================
- This section documents various extensions provided by libc++, how they're
- provided, and any information regarding how to use them.
- .. _nodiscard extension:
- Extended applications of ``[[nodiscard]]``
- ------------------------------------------
- The ``[[nodiscard]]`` attribute is intended to help users find bugs where
- function return values are ignored when they shouldn't be. After C++17 the
- C++ standard has started to declared such library functions as ``[[nodiscard]]``.
- However, this application is limited and applies only to dialects after C++17.
- Users who want help diagnosing misuses of STL functions may desire a more
- liberal application of ``[[nodiscard]]``.
- For this reason libc++ provides an extension that does just that! The
- extension must be enabled by defining ``_LIBCPP_ENABLE_NODISCARD``. The extended
- applications of ``[[nodiscard]]`` takes two forms:
- 1. Backporting ``[[nodiscard]]`` to entities declared as such by the
- standard in newer dialects, but not in the present one.
- 2. Extended applications of ``[[nodiscard]]``, at the libraries discretion,
- applied to entities never declared as such by the standard.
- Users may also opt-out of additional applications ``[[nodiscard]]`` using
- additional macros.
- Applications of the first form, which backport ``[[nodiscard]]`` from a newer
- dialect may be disabled using macros specific to the dialect it was added. For
- example ``_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17``.
- Applications of the second form, which are pure extensions, may be disabled
- by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``.
- Entities declared with ``_LIBCPP_NODISCARD_EXT``
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- This section lists all extended applications of ``[[nodiscard]]`` to entities
- which no dialect declares as such (See the second form described above).
- * ``adjacent_find``
- * ``all_of``
- * ``any_of``
- * ``binary_search``
- * ``clamp``
- * ``count_if``
- * ``count``
- * ``equal_range``
- * ``equal``
- * ``find_end``
- * ``find_first_of``
- * ``find_if_not``
- * ``find_if``
- * ``find``
- * ``get_temporary_buffer``
- * ``includes``
- * ``is_heap_until``
- * ``is_heap``
- * ``is_partitioned``
- * ``is_permutation``
- * ``is_sorted_until``
- * ``is_sorted``
- * ``lexicographical_compare``
- * ``lower_bound``
- * ``max_element``
- * ``max``
- * ``min_element``
- * ``min``
- * ``minmax_element``
- * ``minmax``
- * ``mismatch``
- * ``none_of``
- * ``remove_if``
- * ``remove``
- * ``search_n``
- * ``search``
- * ``unique``
- * ``upper_bound``
- * ``lock_guard``'s constructors
|