libc++

"libc++" C++ Standard Library

libc++ is a new implementation of the C++ standard library, targeting C++11.

All of the code in libc++ is dual licensed under the MIT license and the UIUC License (a BSD-like license).

Features and Goals

  • Correctness as defined by the C++11 standard.
  • Fast execution.
  • Minimal memory use.
  • Fast compile times.
  • ABI compatibility with gcc‘s libstdc++ for some low-level features such as exception objects, rtti and memory allocation.
  • Extensive unit tests.

Why a new C++ Standard Library for C++11?

After its initial introduction, many people have asked "why start a new library instead of contributing to an existing library?" (like Apache‘s libstdcxx, GNU‘s libstdc++, STLport, etc). There are many contributing reasons, but some of the major ones are:

  • From years of experience (including having implemented the standard library before), we‘ve learned many things about implementing the standard containers which require ABI breakage and fundamental changes to how they are implemented. For example, it is generally accepted that building std::string using the "short string optimization" instead of using Copy On Write (COW) is a superior approach for multicore machines (particularly in C++11, which has rvalue references). Breaking ABI compatibility with old versions of the library was determined to be critical to achieving the performance goals of libc++.
  • Mainline libstdc++ has switched to GPL3, a license which the developers of libc++ cannot use. libstdc++ 4.2 (the last GPL2 version) could be independently extended to support C++11, but this would be a fork of the codebase (which is often seen as worse for a project than starting a new independent one). Another problem with libstdc++ is that it is tightly integrated with G++ development, tending to be tied fairly closely to the matching version of G++.
  • STLport and the Apache libstdcxx library are two other popular candidates, but both lack C++11 support. Our experience (and the experience of libstdc++ developers) is that adding support for C++11 (in particular rvalue references and move-only types) requires changes to almost every class and function, essentially amounting to a rewrite. Faced with a rewrite, we decided to start from scratch and evaluate every design decision from first principles based on experience.

    Further, both projects are apparently abandoned: STLport 5.2.1 was released in Oct‘08, and STDCXX 4.2.1 in May‘08.

Platform Support

libc++ is known to work on the following platforms, using g++-4.2 and clang (lack of C++11 language support disables some functionality). Note that functionality provided by <atomic> is only functional with clang.

  • Mac OS X i386
  • Mac OS X x86_64
  • FreeBSD 10+ i386
  • FreeBSD 10+ x86_64
  • FreeBSD 10+ ARM

Current Status

libc++ is a 100% complete C++11 implementation on Apple‘s OS X.

LLVM and Clang can self host in C++ and C++11 mode with libc++ on Linux.

libc++ is also a 100% complete C++14 implementation. A list of new features and changes for C++14 can be found here.

A list of features and changes for the next C++ standard, known here as "C++1z" (probably to be C++17) can be found here.

Implementation of the post-c++14 Technical Specifications is in progress. A list of features and the current status of these features can be found here.

Ports to other platforms are underway. Here are recent test results for Windows and Linux.

Build Bots

The latest libc++ build results can be found at the following locations.

Get it and get involved!

First please review our Developer‘s Policy.

On Mac OS 10.7 (Lion) and later, the easiest way to get this library is to install Xcode 4.2 or later. However if you want to install tip-of-trunk from here (getting the bleeding edge), read on. However, be warned that Mac OS 10.7 will not boot without a valid copy of libc++.1.dylib in /usr/lib.

To check out the code, use:

  • svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx

Note that for an in-tree build, you should check out libcxx to llvm/projects.

The following instructions are for building libc++ on FreeBSD, Linux, or Mac using libc++abi as the C++ ABI library. On Linux, it is also possible to use libsupc++ or libcxxrt.

In-tree build:

  • Check out libcxx and libcxxabi into llvm/projects
  • cd llvm
  • mkdir build && cd build
  • cmake .. # Linux may require -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
  • make cxx

Out-of-tree build:

  • Check out libcxx
  • If not on a Mac, also check out libcxxabi
  • cd libcxx
  • mkdir build && cd build
  • cmake -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_LIBCXXABI_INCLUDE_PATHS=path/to/libcxxabi/include -DLIT_EXECUTABLE=path/to/llvm/utils/lit/lit.py .. # Linux may require -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
  • make

To run the tests:

  • make check-libcxx

If you wish to run a subset of the test suite:

  • cd path/to/libcxx/libcxx
  • alias lit=‘python path/to/llvm/utils/lit/lit.py‘
  • ln -s path/to/build/dir/projects/libcxx/test/lit.site.cfg test/lit.site.cfg
  • lit -sv test/re/ # or whichever subset of tests you‘re interested in

The above is currently quite inconvenient. Sorry! We‘re working on it!

More information on using LIT can be found here. For more general information about the LLVM testing infrastructure, see the LLVM Testing Infrastructure Guide

Shared libraries for libc++ should now be present in llvm/build/lib. Note that it is safest to use this from its current location rather than replacing your system‘s libc++ (if it has one, if not, go right ahead).

Mac users, remember to be careful when replacing the system‘s libc++. Your system will not be able to boot without a funcioning libc++.

Notes

Building libc++ with -fno-rtti is not supported. However linking against it with -fno-rtti is supported.

Send discussions to the clang mailing list.

Using libc++ in your programs

FreeBSD and Mac OS X

To use your system-installed libc++ with clang you can:

  • clang++ -stdlib=libc++ test.cpp
  • clang++ -std=c++11 -stdlib=libc++ test.cpp

To use your tip-of-trunk libc++ on Mac OS with clang you can:

  • export DYLD_LIBRARY_PATH=path/to/build/lib
  • clang++ -std=c++11 -stdlib=libc++ -nostdinc++ -I<path-to-libcxx>/include -L<path-to-libcxx>/lib test.cpp

Linux

You will need to keep the source tree of libc++abi available on your build machine and your copy of the libc++abi shared library must be placed where your linker will find it.

Unfortunately you can‘t simply run clang with "-stdlib=libc++" at this point, as clang is set up to link for libc++ linked to libsupc++. To get around this you‘ll have to set up your linker yourself (or patch clang). For example:

  • clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -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:

  • clang++ -stdlib=libc++ helloworld.cpp -lc++abi

Bug reports and patches

If you think you‘ve found a bug in libc++, please report it using the LLVM Bugzilla. If you‘re not sure, you can post a message to the cfe-dev mailing list or on IRC. Please include "libc++" in your subject.

If you want to contribute a patch to libc++, the best place for that is the cfe-commits mailing list. Please include "libc++" and "PATCH" in your subject.

Build on Linux using CMake and libsupc++.

You will need libstdc++ in order to provide libsupc++.

Figure out where the libsupc++ headers are on your system. On Ubuntu this is /usr/include/c++/<version> and /usr/include/c++/<version>/<target-triple>

You can also figure this out by running

$ echo | g++ -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.7
 /usr/include/c++/4.7/x86_64-linux-gnu
 /usr/include/c++/4.7/backward
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
     

Note the first two entries happen to be what we are looking for. This may not be correct on other platforms.

We can now run CMake:

  • CC=clang CXX=clang++ cmake -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libstdc++ -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr <libc++-source-dir>
  • You can also substitute -DLIBCXX_CXX_ABI=libsupc++ above, which will cause the library to be linked to libsupc++ instead of libstdc++, but this is only recommended if you know that you will never need to link against libstdc++ in the same executable as libc++. GCC ships libsupc++ separately but only as a static library. If a program also needs to link against libstdc++, it will provide its own copy of libsupc++ and this can lead to subtle problems.
  • make
  • sudo make install

You can now run clang with -stdlib=libc++.

Build on Linux using CMake and libcxxrt.

You will need to keep the source tree of libcxxrt available on your build machine and your copy of the libcxxrt shared library must be placed where your linker will find it.

We can now run CMake:

  • CC=clang CXX=clang++ cmake -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libcxxrt -DLIBCXX_LIBCXXRT_INCLUDE_PATHS="<libcxxrt-source-dir>/src" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr <libc++-source-dir>
  • make
  • sudo make install

Unfortunately you can‘t simply run clang with "-stdlib=libc++" at this point, as clang is set up to link for libc++ linked to libsupc++. To get around this you‘ll have to set up your linker yourself (or patch clang). For example,

  • clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lcxxrt -lm -lc -lgcc_s -lgcc

Alternately, you could just add libcxxrt to your libraries list, which in most situations will give the same result:

  • clang++ -stdlib=libc++ helloworld.cpp -lcxxrt

Using a local ABI library

Note: This is not recommended in almost all cases.
Generally these instructions should only be used when you can‘t install your ABI library.

Normally you must link libc++ against a ABI shared library that the linker can find. If you want to build and test libc++ against an ABI library not in the linker‘s path you need to set -DLIBCXX_CXX_ABI_LIBRARY_PATH=/path/to/abi/lib when configuring CMake.

An example build using libc++abi would look like:

  • CC=clang CXX=clang++ cmake -DLIBCXX_CXX_ABI=libc++abi -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="/path/to/libcxxabi/include" -DLIBCXX_CXX_ABI_LIBRARY_PATH="/path/to/libcxxabi-build/lib" path/to/libcxx
  • make

When testing libc++ LIT will automatically link against the proper ABI library.

Design Documents

时间: 2024-08-24 18:24:04

libc++的相关文章

Linux误删C基本运行库libc.so.6急救方法

首先普及一下关于libc.so.6的基本常识: libc.so.6是glibc的软链接 ll  /lib64/libc.so.6lrwxrwxrwx 1 root root 11 Aug 27 2014 /lib64/libc.so.6 -> libc-2.5.so glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc,所以说绝大部分操作命令都缺少不了它 如何误删了/lib64/libc.so.6,大部分系统命令将无法

解决libc.so.6(GLIBC_2.14)(64bit)等之类的没有问题

http://rpm.pbone.net/index.php3/stat/3/limit/2/srodzaj/1/dl/40/search/libc.so.6%28GLIBC_2.14%29%2864bit%29/field[]/1/field[] 登录然后找找就行了,rpm全自动. 解决libc.so.6(GLIBC_2.14)(64bit)等之类的没有问题,布布扣,bubuko.com

Cent OS 7编译安装libc++和libc++abi

本文介绍了如何在CentOS 7中构建C++11构建环境 Clang的定制C++库是libc++(libcxx).然后,libcxx还需要一个ABI库,libc++abi(libcxxabi).不幸的是,这两个库有一个循环依赖问题.为了打破循环依赖问题,可以在不连接libc++abi的情况下构建libc++.然后,使用这个libc++,我们可以构建libc++abi链接到libc++.最后,使用libc++abi,我们可以构建一个新的libc++链接到libc++abi. cmake和clang

解决&quot;libc.so.6: version `GLIBC_2.14&#39; not found&quot;,系统的glibc版本太低

一.查看系统glibc支持的版本: strings /lib64/libc.so.6 |grep GLIBC_ 或 rpm -qa |grep glibc 二.下载 到http://www.gnu.org/software/libc/下载最新版本,我这里下载了glibc-2.14.tar.xz 这个版本 http://ftp.gnu.org/gnu/glibc/ 三.解压 这里解压到/var/VMdisks/glibc-2.14/ cd /var/VMdisks/glibc-2.14/ 在gli

误删除libc.so.6的解决方法

glibc是GNU发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现.由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象.而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个作业系统.在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演

libc.so.6 误删后修复

libc.so.6 被删除了(libc.so.6只是个链接,真实的lib 文件是 libc-2.15.so) su, sudo,ls, cp, mv 等等一系列命令都不能在使用 以下是几种修复措施: 在没有重启电脑的情况下,可以使用以下两种方式.前提是你目前在root 权限下1. (实验可行)#cd /lib/i386-linux-gnu#LD_PRELOAD=/lib/i386-linux-gnu/libc-2.15.so ln -sf /lib/i386-linux-gnu/libc-2.1

IOS Exception 1(libc++abi.dylib: terminating with uncaught exception of type NSException)

2014-08-05 22:18:46.455 SwiftUI[1329:40871] -[_TtC7SwiftUI14MViewControler clickMe]: unrecognized selector sent to instance 0x10ea15dc0 2014-08-05 22:18:46.458 SwiftUI[1329:40871] *** Terminating app due to uncaught exception 'NSInvalidArgumentExcept

CentOS中误删除libc.so.6系统库文件,如何恢复?

在做实验的过程中,对于一些系统关键的库,要小心使用,稍不留神就会造成系统的瘫痪,比如小编在做实验的时候不小心将/lib64/libc.so.6这个系统共享库给不小心删除了,可能刚开始不知道这个库的重要性,结果下一秒就后悔了,因为系统大部分的命令都不能正常使用了,会显示一个:error while loading shared libraries: libc.so.6:cannot open shared object file: No such file or directory. 提示当加载共

解决&quot;libc.so.6: version `GLIBC_2.14&#39; not found&quot;问题

试图运行程序,提示"libc.so.6: version `GLIBC_2.14' not found",原因是系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的:问题Centos 自动更新glibc-2.14 2.查看系统glibc支持的版本: strings /lib64/libc.so.6 |grep GLIBC_ rpm -qa |grep glibc ------------------------------- 可以看到最高只支持2.12版本,所以考虑编译

libc++abi.dylib: terminate_handler unexpectedly错误

http://my.oschina.net/ioslighter/blog/384328 今天测试app时发现一个必现的异常,当在登录成功后再打开登录前点击的页面时,就会在Xcode console中打印如下日志: NSScanner:nil string argumentNSScanner:nil string argumentlibc++abi.dylib: terminate_handler unexpectedly threw an exception 然后app就会crash掉. 搜索