首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ubuntu上安装libc++

在ubuntu上安装libc++
EN

Stack Overflow用户
提问于 2016-09-05 22:08:00
回答 6查看 39.5K关注 0票数 29

我想知道在Ubuntu上安装二进制libc++的正确/简单的方法是什么?

在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++,任何指向安装二进制文件的指示都将受到感谢。

EN

回答 6

Stack Overflow用户

发布于 2017-05-04 04:52:04

如何在Ubuntu16.04上构建libc++

我遇到了和你类似的问题。虽然在libstdc++上测试clang在C++11和C++14上工作得很好,但libstdc++仍然可能存在许可问题。因此,我最终从他们的资源库中安装了Clang toolchain,并在Ubuntu16.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 https://apt.llvm.org/llvm-snapshot.gpg.key |apt-key add -

  • 创建新的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 <代码>C30<代码>D31<代码>C32 llvm-toolchain-xenial-4.0 main EOF

  • Install克隆和从LLVM存储库构建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

  • Create是C++编译器和链接器的替代方案。这不是必须的,但允许您在需要时切换编译器或链接器。此外,据我所知,一些构建文件需要ccc++clang++。请记住,我们默认切换到LLD链接器:

libc++ 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

  • Checkout 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

  • 的源代码要在Linux上运行libc++需要与标准库兼容,例如libstdc++。这就是libc++abi进入游戏的地方。唯一的问题是,它需要在为其构建的系统上安装libc++。因此,libc++的构建分两步完成。第一:没有任何ABI兼容性。但它将用于ABI库的引导,然后第二步是使用系统上存在的适当ABI重新编译libc++

在没有适当ABI的情况下启动=> build 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

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

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库重新构建libc++

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

  • Create一个测试文件,以检查是否一切正常。您还应该测试cerr流,因为以前libc++abi不支持它,并且存在一些段错误。请参考this question

创建test.cpp文件:

#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; }

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

clang++ -std=c++11 -stdlib=libc++ -lc++abi test.cpp && ./a.out

没有套餐的原因

我找到了用于Ubuntu的libc++包,但它们比最近的版本要晚一点:https://packages.ubuntu.com/xenial/libc++-dev

为什么它们不是最新的,我不能回答,但我猜LLVM+Clang可以与大多数标准库一起工作,而您所看到的libc++必须链接到特定的运行时ABI,并且可能严重依赖于可用的C运行时库。我同意应该有一个涵盖九成个案的方案。也许这只是资源的匮乏。Searching the mailing archive没有提出任何特别的东西。

票数 36
EN

Stack Overflow用户

发布于 2017-08-16 11:30:59

代码语言:javascript
复制
sudo apt-get update
sudo apt-get install libc++-dev
票数 19
EN

Stack Overflow用户

发布于 2021-11-21 16:19:38

被接受的答案给了我一些错误(目前是2021年11月)。此外,sudo apt install libc++-dev libc++abi-dev没有提供最新的libc++。这里有一个替代的解决方案。

使用LLVM apt package maintainer的脚本:

sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

这将自动设置apt存储库并为您提供最新的LLVM工具链。

clang-13 --version

既然现在已经有了http://apt.llvm.org提供的最新libc++包,就可以安装最新的LLVM了。首先确定最新版本:

apt search libc++ | grep libc++

然后:

sudo apt install libc++-13-dev libc++abi-13-dev

您可以选择使用update-alternatives使您的系统使用clang-13而不是默认设置。对此有一个gist

代码语言:javascript
复制
wget https://gist.githubusercontent.com/junkdog/70231d6953592cd6f27def59fe19e50d/raw/update-alternatives-clang.sh
chmod +x update-alternatives-clang.sh
sudo ./update-alternatives-clang.sh 13 1000

现在:

代码语言:javascript
复制
clang --version
Debian clang version 13.0.1-++20211110062941+9dc7d6d5e326-1~exp1~20211110183517.26
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39332406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档