在ubuntu上安装libc ++

时间:2016-09-05 14:08:00

标签: clang libc++

我想知道在Ubuntu上安装二进制libc ++的正确/简单方法是什么,在我的案例中,Trusty又名14.04?

在LLVM网站上有apt软件包http://apt.llvm.org/,我用它们来安装3.9。但是这些包似乎不包含libc ++。我安装了libc ++ - dev包,但这似乎是一个非常古老的版本。还有可以下载的二进制文件http://llvm.org/releases/download.html#3.9.0。这些似乎包含libc ++,但我不确定我是否可以将这些内容复制到像/ usr / include / c ++ / v1这样的地方,实际上我并不确定我需要复制哪些内容。我知道我可以在备用位置使用libc ++,如我所述http://libcxx.llvm.org/docs/UsingLibcxx.html所述。但是,我无法修改我所做的大型代码库的构建系统。

因此,三个apt包不包含libc ++的任何原因也是如此,任何指向安装二进制文件的指针都会感激不尽。

4 个答案:

答案 0 :(得分:28)

如何在Ubuntu 16.04上构建libc ++

我和你有类似的问题。虽然使用libstdc ++测试clang在C ++ 11和C ++ 14中运行良好,但libstdc ++仍可能存在许可问题。所以我最后从他们的repos安装了Clang工具链,并在Ubuntu 16.04上编译了libc ++。

免责声明:这篇文章是关于如何在Ubuntu Linux上构建libc++的长搜索的摘要。我在2017年发现的许多帖子要么过时,要么在其他系统中描述部分解决方案,例如CentOS的。这篇文章的链接是:

以下是从4.0版本开始使用LLVM + Clang + libc ++的步骤:

  1. 安装LLVM存储库的密钥

    # apt-get update && apt-get dist-upgrade -y && apt-get install -y vim curl && \ curl -q http://apt.llvm.org/llvm-snapshot.gpg.key |apt-key add -

  2. 创建一个新的新APT存储库文件(您还可以排除引用v3.9存储库的2行)

    # cat > /etc/apt/sources.list.d/llvm-repos.list <<EOF deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial main deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial main deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main EOF

  3. 安装Clang和从LLVM repos构建libc ++所需的所有包

    # apt-get update && apt-get install -y clang-4.0 clang-4.0-doc \ libclang-common-4.0-dev libclang-4.0-dev libclang1-4.0 libclang1-4.0-dbg \ libllvm4.0 libllvm4.0-dbg lldb-4.0 llvm-4.0 llvm-4.0-dev llvm-4.0-runtime \ clang-format-4.0 python-clang-4.0 liblldb-4.0-dev lld-4.0 libfuzzer-4.0-dev \ subversion cmake

  4. 为C ++编译器和链接器创建替代方案。这不是必须的,但如果需要,可以让您切换编译器或链接器。另外,根据我的记忆,一些构建文件需要ccc++clang++。请记住,我们默认切换到LLD链接器:

    update-alternatives --install /usr/bin/cc cc /usr/bin/clang-4.0 100 \ && update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-4.0 100 \ && update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-4.0 100 \ && update-alternatives --install /usr/bin/clang clang /usr/bin/clang-4.0 100 \ && update-alternatives --install /usr/bin/ld ld /usr/bin/ld.lld-4.0 10 \ && update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 20 \ && update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 30 \ && ld --version && echo 3 | update-alternatives --config ld && ld --version

  5. 结帐libc++libc++abi的来源:

    $ cd /tmp $ svn co http://llvm.org/svn/llvm-project/libcxx/branches/release_40/ libcxx $ svn co http://llvm.org/svn/llvm-project/libcxxabi/branches/release_40/ libcxxabi $ mkdir -p libcxx/build libcxxabi/build

  6. 要在Linux上运行libc++,需要ABI与标准库的兼容性,例如:的libstdc ++。这是libc++abi进入游戏的地方。唯一的问题是它需要libc++在它所构建的系统上。因此libc++分为两步。第一:没有任何ABI兼容性。但是它将用于引导ABI lib,而第二步是使用系统中存在的适当ABI重新编译libc++

    Bootstraping =&gt;没有适当的ABI构建libc++

    cd /tmp/libcxx/build cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CONFIG_PATH=/usr/bin/llvm-config-4.0\ -DCMAKE_INSTALL_PREFIX=/usr .. \ && make install

    使用libc++abi兼容的ABI构建libstdc++

    cd /tmp/libcxxabi/build CPP_INCLUDE_PATHS=echo | c++ -Wp,-v -x c++ - -fsyntax-only 2>&1 \ |grep ' /usr'|tr '\n' ' '|tr -s ' ' |tr ' ' ';' CPP_INCLUDE_PATHS="/usr/include/c++/v1/;$CPP_INCLUDE_PATHS" cmake -G "Unix Makefiles" -DLIBCXX_CXX_ABI=libstdc++ \ -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="$CPP_INCLUDE_PATHS" \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \ -DLLVM_CONFIG_PATH=/usr/bin/llvm-config-4.0 \ -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include .. make install

    使用在系统上部署的适当ABI lib重建echo | c++ -Wp,-v -x c++ - -fsyntax-only 2>&1 \ |grep ' /usr'|tr '\n' ' '|tr -s ' ' |tr ' ' ';'

    libc++

  7. 创建一个测试文件以检查一切是否正常。 IMO你还应该测试cd /tmp/libcxx/build cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \ -DLIBCXX_CXX_ABI=libcxxabi -DLLVM_CONFIG_PATH=/usr/bin/llvm-config-4.0\ -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include .. \ && make install流,因为之前cerr不支持,并且有一些段错误。请参阅this question

    创建一个test.cpp文件:

    libc++abi

    编译并使用以下命令行运行它:

    #include <iostream> int main() { using namespace std; cout << "[OK] Hello world to cout!" << endl; cerr << "[OK] Hello world to cerr!" << endl; clog << "[OK] Hello world to clog!" << endl; return 0; }

  8. 原因是没有包

    我找到了Ubuntu的libc ++软件包,但它们有点落后于最新版本:https://packages.ubuntu.com/xenial/libc++-dev

    为什么它们不是最新的,我无法回答,但我的猜测是LLVM + Clang可以与大多数标准库一起使用,而你看到的libc ++必须链接到特定的运行时ABI,并且可能在很大程度上取决于可用的C运行时库。我同意应该有一个涵盖90%案件的方案。可能这只是缺乏资源。 Searching the mailing archive没有提出任何特别的内容。

答案 1 :(得分:7)

sudo apt-get update
sudo apt-get install libc++-dev

答案 2 :(得分:1)

获得有效的libc ++的最简单方法是在/usr/local下安装整个3.9.0工具链。这将允许/ usr / local / bin / clang ++正确查找头文件,并允许链接器查找/ usr / local / lib / libc ++。所以。

答案 3 :(得分:0)

检查我的shell脚本自动化版本:

https://github.com/sailfish009/llvm_all

$ sudo apt-get install libffi-dev libedit-dev swig git

$ git clone https://github.com/sailfish009/llvm_all

$ git clone https://github.com/llvm/llvm-project

$ cd llvm_all

$ cp *.sh ../llvm-project/

$ cd ../llvm-project/

$ ./set.sh

$ ./install.sh

$ clang++ --version
clang version 11.0.0 (https://github.com/llvm/llvm-project 032251e34d17c1cbf21e7571514bb775ed5cdf30)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin