Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 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 | |
J. Ryan Stinnett | d45eaf9 | 2019-05-30 16:46:22 | [diff] [blame] | 18 | On macOS and FreeBSD libc++ is the default standard library |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 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 |
J. Ryan Stinnett | d45eaf9 | 2019-05-30 16:46:22 | [diff] [blame] | 37 | environment variable ``LD_LIBRARY_PATH`` (``DYLD_LIBRARY_PATH`` on macOS) can |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 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 | |
Louis Dionne | 9523872 | 2019-03-21 16:21:09 | [diff] [blame] | 52 | Using ``<filesystem>`` |
| 53 | ====================== |
| 54 | |
| 55 | Prior to LLVM 9.0, libc++ provides the implementation of the filesystem library |
| 56 | in a separate static library. Users of ``<filesystem>`` and ``<experimental/filesystem>`` |
| 57 | are required to link ``-lc++fs``. Prior to libc++ 7.0, users of |
| 58 | ``<experimental/filesystem>`` were required to link libc++experimental. |
| 59 | |
| 60 | Starting with LLVM 9.0, support for ``<filesystem>`` is provided in the main |
| 61 | library and nothing special is required to use ``<filesystem>``. |
Eric Fiselier | 998a5c8 | 2018-07-27 03:07:09 | [diff] [blame] | 62 | |
Eric Fiselier | 539cd67 | 2016-05-03 22:32:08 | [diff] [blame] | 63 | Using libc++experimental and ``<experimental/...>`` |
| 64 | ===================================================== |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 65 | |
Eric Fiselier | 539cd67 | 2016-05-03 22:32:08 | [diff] [blame] | 66 | Libc++ provides implementations of experimental technical specifications |
| 67 | in a separate library, ``libc++experimental.a``. Users of ``<experimental/...>`` |
Eric Fiselier | 7946c3f | 2016-05-06 04:49:30 | [diff] [blame] | 68 | headers may be required to link ``-lc++experimental``. |
Eric Fiselier | 539cd67 | 2016-05-03 22:32:08 | [diff] [blame] | 69 | |
| 70 | .. code-block:: bash |
| 71 | |
| 72 | $ clang++ -std=c++14 -stdlib=libc++ test.cpp -lc++experimental |
| 73 | |
| 74 | Libc++experimental.a may not always be available, even when libc++ is already |
| 75 | installed. For information on building libc++experimental from source see |
| 76 | :ref:`Building Libc++ <build instructions>` and |
| 77 | :ref:`libc++experimental CMake Options <libc++experimental options>`. |
| 78 | |
| 79 | Also see the `Experimental Library Implementation Status <http://libcxx.llvm.org/ts1z_status.html>`__ |
| 80 | page. |
| 81 | |
| 82 | .. warning:: |
| 83 | Experimental libraries are Experimental. |
| 84 | * The contents of the ``<experimental/...>`` headers and ``libc++experimental.a`` |
| 85 | library will not remain compatible between versions. |
| 86 | * No guarantees of API or ABI stability are provided. |
Louis Dionne | 776acf2 | 2019-06-11 14:48:40 | [diff] [blame] | 87 | * When we implement the standardized version of an experimental feature, |
| 88 | the experimental feature is removed two releases after the non-experimental |
| 89 | version has shipped. The full policy is explained :ref:`here <experimental features>`. |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 90 | |
| 91 | Using libc++ on Linux |
| 92 | ===================== |
| 93 | |
Eric Fiselier | 1ab69fc | 2015-10-15 22:41:51 | [diff] [blame] | 94 | On Linux libc++ can typically be used with only '-stdlib=libc++'. However |
| 95 | some libc++ installations require the user manually link libc++abi themselves. |
| 96 | If you are running into linker errors when using libc++ try adding '-lc++abi' |
| 97 | to the link line. For example: |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 98 | |
| 99 | .. code-block:: bash |
| 100 | |
| 101 | $ clang++ -stdlib=libc++ test.cpp -lc++ -lc++abi -lm -lc -lgcc_s -lgcc |
| 102 | |
| 103 | Alternately, you could just add libc++abi to your libraries list, which in |
| 104 | most situations will give the same result: |
| 105 | |
| 106 | .. code-block:: bash |
| 107 | |
| 108 | $ clang++ -stdlib=libc++ test.cpp -lc++abi |
| 109 | |
| 110 | |
| 111 | Using libc++ with GCC |
| 112 | --------------------- |
| 113 | |
| 114 | GCC does not provide a way to switch from libstdc++ to libc++. You must manually |
| 115 | configure the compile and link commands. |
| 116 | |
Jennifer Chukwu | 21bef4e | 2021-04-17 15:04:06 | [diff] [blame^] | 117 | In particular, you must tell GCC to remove the libstdc++ include directories |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 118 | using ``-nostdinc++`` and to not link libstdc++.so using ``-nodefaultlibs``. |
| 119 | |
Jennifer Chukwu | 21bef4e | 2021-04-17 15:04:06 | [diff] [blame^] | 120 | Note that ``-nodefaultlibs`` removes all the standard system libraries and |
Eric Fiselier | b17bb06 | 2015-08-22 19:40:49 | [diff] [blame] | 121 | not just libstdc++ so they must be manually linked. For example: |
| 122 | |
| 123 | .. code-block:: bash |
| 124 | |
| 125 | $ g++ -nostdinc++ -I<libcxx-install-prefix>/include/c++/v1 \ |
| 126 | test.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc |
Eric Fiselier | 19352b1 | 2016-01-20 01:26:30 | [diff] [blame] | 127 | |
| 128 | |
| 129 | GDB Pretty printers for libc++ |
| 130 | ------------------------------ |
| 131 | |
| 132 | GDB does not support pretty-printing of libc++ symbols by default. Unfortunately |
| 133 | libc++ does not provide pretty-printers itself. However there are 3rd |
| 134 | party implementations available and although they are not officially |
| 135 | supported by libc++ they may be useful to users. |
| 136 | |
| 137 | Known 3rd Party Implementations Include: |
| 138 | |
| 139 | * `Koutheir's libc++ pretty-printers <https://github.com/koutheir/libcxx-pretty-printers>`_. |
Eric Fiselier | efd48ca | 2016-11-13 23:00:30 | [diff] [blame] | 140 | |
| 141 | |
| 142 | Libc++ Configuration Macros |
| 143 | =========================== |
| 144 | |
| 145 | Libc++ provides a number of configuration macros which can be used to enable |
| 146 | or disable extended libc++ behavior, including enabling "debug mode" or |
| 147 | thread safety annotations. |
| 148 | |
| 149 | **_LIBCPP_DEBUG**: |
Eric Fiselier | 687d321 | 2016-12-28 04:58:52 | [diff] [blame] | 150 | See :ref:`using-debug-mode` for more information. |
Eric Fiselier | efd48ca | 2016-11-13 23:00:30 | [diff] [blame] | 151 | |
| 152 | **_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS**: |
| 153 | This macro is used to enable -Wthread-safety annotations on libc++'s |
Jennifer Chukwu | 21bef4e | 2021-04-17 15:04:06 | [diff] [blame^] | 154 | ``std::mutex`` and ``std::lock_guard``. By default, these annotations are |
Eric Fiselier | efd48ca | 2016-11-13 23:00:30 | [diff] [blame] | 155 | disabled and must be manually enabled by the user. |
Shoaib Meenai | fc6100c | 2016-12-05 19:40:12 | [diff] [blame] | 156 | |
| 157 | **_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS**: |
| 158 | This macro is used to disable all visibility annotations inside libc++. |
| 159 | Defining this macro and then building libc++ with hidden visibility gives a |
| 160 | build of libc++ which does not export any symbols, which can be useful when |
| 161 | building statically for inclusion into another library. |
Eric Fiselier | bd68825 | 2016-12-08 23:57:08 | [diff] [blame] | 162 | |
Shoaib Meenai | 461764d | 2017-04-13 20:13:32 | [diff] [blame] | 163 | **_LIBCPP_DISABLE_EXTERN_TEMPLATE**: |
| 164 | This macro is used to disable extern template declarations in the libc++ |
| 165 | headers. The intended use case is for clients who wish to use the libc++ |
| 166 | headers without taking a dependency on the libc++ library itself. |
| 167 | |
Eric Fiselier | bd68825 | 2016-12-08 23:57:08 | [diff] [blame] | 168 | **_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION**: |
| 169 | This macro is used to re-enable an extension in `std::tuple` which allowed |
| 170 | it to be implicitly constructed from fewer initializers than contained |
| 171 | elements. Elements without an initializer are default constructed. For example: |
| 172 | |
| 173 | .. code-block:: cpp |
| 174 | |
| 175 | std::tuple<std::string, int, std::error_code> foo() { |
| 176 | return {"hello world", 42}; // default constructs error_code |
| 177 | } |
| 178 | |
| 179 | |
| 180 | Since libc++ 4.0 this extension has been disabled by default. This macro |
| 181 | may be defined to re-enable it in order to support existing code that depends |
| 182 | on the extension. New use of this extension should be discouraged. |
Sylvestre Ledru | 72fd103 | 2020-03-22 21:42:03 | [diff] [blame] | 183 | See `PR 27374 <https://llvm.org/PR27374>`_ for more information. |
Eric Fiselier | bd68825 | 2016-12-08 23:57:08 | [diff] [blame] | 184 | |
| 185 | Note: The "reduced-arity-initialization" extension is still offered but only |
| 186 | for explicit conversions. Example: |
| 187 | |
| 188 | .. code-block:: cpp |
| 189 | |
| 190 | auto foo() { |
| 191 | using Tup = std::tuple<std::string, int, std::error_code>; |
| 192 | return Tup{"hello world", 42}; // explicit constructor called. OK. |
| 193 | } |
Eric Fiselier | 642d9a1 | 2016-12-09 12:32:02 | [diff] [blame] | 194 | |
Eric Fiselier | b1e7a12 | 2017-01-13 22:02:08 | [diff] [blame] | 195 | **_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS**: |
| 196 | This macro disables the additional diagnostics generated by libc++ using the |
| 197 | `diagnose_if` attribute. These additional diagnostics include checks for: |
| 198 | |
Louis Dionne | 3560fbf3 | 2018-12-06 21:46:17 | [diff] [blame] | 199 | * Giving `set`, `map`, `multiset`, `multimap` and their `unordered_` |
| 200 | counterparts a comparator which is not const callable. |
| 201 | * Giving an unordered associative container a hasher that is not const |
| 202 | callable. |
Eric Fiselier | b1e7a12 | 2017-01-13 22:02:08 | [diff] [blame] | 203 | |
Shoaib Meenai | 492d713 | 2017-10-09 19:25:17 | [diff] [blame] | 204 | **_LIBCPP_NO_VCRUNTIME**: |
| 205 | Microsoft's C and C++ headers are fairly entangled, and some of their C++ |
| 206 | headers are fairly hard to avoid. In particular, `vcruntime_new.h` gets pulled |
| 207 | in from a lot of other headers and provides definitions which clash with |
| 208 | libc++ headers, such as `nothrow_t` (note that `nothrow_t` is a struct, so |
| 209 | there's no way for libc++ to provide a compatible definition, since you can't |
| 210 | have multiple definitions). |
| 211 | |
| 212 | By default, libc++ solves this problem by deferring to Microsoft's vcruntime |
| 213 | headers where needed. However, it may be undesirable to depend on vcruntime |
| 214 | headers, since they may not always be available in cross-compilation setups, |
| 215 | or they may clash with other headers. The `_LIBCPP_NO_VCRUNTIME` macro |
| 216 | prevents libc++ from depending on vcruntime headers. Consequently, it also |
| 217 | prevents libc++ headers from being interoperable with vcruntime headers (from |
| 218 | the aforementioned clashes), so users of this macro are promising to not |
| 219 | attempt to combine libc++ headers with the problematic vcruntime headers. This |
| 220 | macro also currently prevents certain `operator new`/`operator delete` |
| 221 | replacement scenarios from working, e.g. replacing `operator new` and |
| 222 | expecting a non-replaced `operator new[]` to call the replaced `operator new`. |
| 223 | |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 224 | **_LIBCPP_ENABLE_NODISCARD**: |
| 225 | Allow the library to add ``[[nodiscard]]`` attributes to entities not specified |
| 226 | as ``[[nodiscard]]`` by the current language dialect. This includes |
| 227 | backporting applications of ``[[nodiscard]]`` from newer dialects and |
| 228 | additional extended applications at the discretion of the library. All |
| 229 | additional applications of ``[[nodiscard]]`` are disabled by default. |
| 230 | See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for |
| 231 | more information. |
| 232 | |
| 233 | **_LIBCPP_DISABLE_NODISCARD_EXT**: |
| 234 | This macro prevents the library from applying ``[[nodiscard]]`` to entities |
| 235 | purely as an extension. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` |
| 236 | for more information. |
| 237 | |
Louis Dionne | a470a13 | 2019-03-12 20:10:06 | [diff] [blame] | 238 | **_LIBCPP_DISABLE_DEPRECATION_WARNINGS**: |
| 239 | This macro disables warnings when using deprecated components. For example, |
| 240 | using `std::auto_ptr` when compiling in C++11 mode will normally trigger a |
| 241 | warning saying that `std::auto_ptr` is deprecated. If the macro is defined, |
| 242 | no warning will be emitted. By default, this macro is not defined. |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 243 | |
Eric Fiselier | 2a1bfa9 | 2017-02-17 03:25:08 | [diff] [blame] | 244 | C++17 Specific Configuration Macros |
| 245 | ----------------------------------- |
| 246 | **_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES**: |
| 247 | This macro is used to re-enable all the features removed in C++17. The effect |
| 248 | is equivalent to manually defining each macro listed below. |
| 249 | |
| 250 | **_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS**: |
| 251 | This macro is used to re-enable the `set_unexpected`, `get_unexpected`, and |
Eric Fiselier | 07e93d3 | 2017-02-17 03:30:25 | [diff] [blame] | 252 | `unexpected` functions, which were removed in C++17. |
| 253 | |
| 254 | **_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR**: |
| 255 | This macro is used to re-enable `std::auto_ptr` in C++17. |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 256 | |
Marek Kurdej | 044b892 | 2021-01-07 11:29:04 | [diff] [blame] | 257 | C++20 Specific Configuration Macros: |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 258 | ------------------------------------ |
| 259 | **_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17**: |
| 260 | This macro can be used to disable diagnostics emitted from functions marked |
| 261 | ``[[nodiscard]]`` in dialects after C++17. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` |
| 262 | for more information. |
| 263 | |
| 264 | |
| 265 | Libc++ Extensions |
| 266 | ================= |
| 267 | |
| 268 | This section documents various extensions provided by libc++, how they're |
| 269 | provided, and any information regarding how to use them. |
| 270 | |
| 271 | .. _nodiscard extension: |
| 272 | |
| 273 | Extended applications of ``[[nodiscard]]`` |
| 274 | ------------------------------------------ |
| 275 | |
| 276 | The ``[[nodiscard]]`` attribute is intended to help users find bugs where |
| 277 | function return values are ignored when they shouldn't be. After C++17 the |
| 278 | C++ standard has started to declared such library functions as ``[[nodiscard]]``. |
| 279 | However, this application is limited and applies only to dialects after C++17. |
| 280 | Users who want help diagnosing misuses of STL functions may desire a more |
| 281 | liberal application of ``[[nodiscard]]``. |
| 282 | |
| 283 | For this reason libc++ provides an extension that does just that! The |
| 284 | extension must be enabled by defining ``_LIBCPP_ENABLE_NODISCARD``. The extended |
| 285 | applications of ``[[nodiscard]]`` takes two forms: |
| 286 | |
| 287 | 1. Backporting ``[[nodiscard]]`` to entities declared as such by the |
| 288 | standard in newer dialects, but not in the present one. |
| 289 | |
Arthur O'Dwyer | 4b7bad9 | 2021-04-05 18:56:03 | [diff] [blame] | 290 | 2. Extended applications of ``[[nodiscard]]``, at the library's discretion, |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 291 | applied to entities never declared as such by the standard. |
| 292 | |
| 293 | Users may also opt-out of additional applications ``[[nodiscard]]`` using |
| 294 | additional macros. |
| 295 | |
| 296 | Applications of the first form, which backport ``[[nodiscard]]`` from a newer |
Arthur O'Dwyer | 4b7bad9 | 2021-04-05 18:56:03 | [diff] [blame] | 297 | dialect, may be disabled using macros specific to the dialect in which it was |
| 298 | added. For example, ``_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17``. |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 299 | |
| 300 | Applications of the second form, which are pure extensions, may be disabled |
| 301 | by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``. |
| 302 | |
| 303 | |
| 304 | Entities declared with ``_LIBCPP_NODISCARD_EXT`` |
| 305 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 306 | |
| 307 | This section lists all extended applications of ``[[nodiscard]]`` to entities |
| 308 | which no dialect declares as such (See the second form described above). |
| 309 | |
Nico Weber | 1362d7e | 2019-04-03 18:13:08 | [diff] [blame] | 310 | * ``adjacent_find`` |
| 311 | * ``all_of`` |
| 312 | * ``any_of`` |
| 313 | * ``binary_search`` |
| 314 | * ``clamp`` |
| 315 | * ``count_if`` |
| 316 | * ``count`` |
| 317 | * ``equal_range`` |
| 318 | * ``equal`` |
| 319 | * ``find_end`` |
| 320 | * ``find_first_of`` |
| 321 | * ``find_if_not`` |
| 322 | * ``find_if`` |
| 323 | * ``find`` |
Roman Lebedev | c65d39a | 2018-09-22 17:54:48 | [diff] [blame] | 324 | * ``get_temporary_buffer`` |
Nico Weber | 1362d7e | 2019-04-03 18:13:08 | [diff] [blame] | 325 | * ``includes`` |
| 326 | * ``is_heap_until`` |
| 327 | * ``is_heap`` |
| 328 | * ``is_partitioned`` |
| 329 | * ``is_permutation`` |
| 330 | * ``is_sorted_until`` |
| 331 | * ``is_sorted`` |
| 332 | * ``lexicographical_compare`` |
| 333 | * ``lower_bound`` |
| 334 | * ``max_element`` |
| 335 | * ``max`` |
| 336 | * ``min_element`` |
| 337 | * ``min`` |
| 338 | * ``minmax_element`` |
| 339 | * ``minmax`` |
| 340 | * ``mismatch`` |
| 341 | * ``none_of`` |
| 342 | * ``remove_if`` |
| 343 | * ``remove`` |
| 344 | * ``search_n`` |
| 345 | * ``search`` |
| 346 | * ``unique`` |
| 347 | * ``upper_bound`` |
Louis Dionne | 86dd28a | 2019-08-13 11:12:28 | [diff] [blame] | 348 | * ``lock_guard``'s constructors |
Arthur O'Dwyer | 4b7bad9 | 2021-04-05 18:56:03 | [diff] [blame] | 349 | * ``as_const`` |
| 350 | * ``forward`` |
| 351 | * ``move`` |
| 352 | * ``move_if_noexcept`` |
| 353 | * ``identity::operator()`` |
| 354 | * ``to_integer`` |
| 355 | * ``to_underlying`` |