在ubuntu上安装libc ++

gon*_*ing 17 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 ++的任何原因,并且任何指向安装二进制文件的指针都会感激不尽.

ova*_*nes 30

如何在Ubuntu 16.04上构建libc ++

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

免责声明:这篇文章是关于如何libc++在Ubuntu Linux上构建的长期搜索的摘要.我在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 -

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

    # 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++编译器和链接器创建替代方案.这不是必须的,但如果需要,可以让您切换编译器或链接器.还有些生成文件需要cc或c++或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. 要libc++在Linux上运行,需要ABI与标准库的兼容性,例如libstdc ++.这是libc++abi进入游戏的地方.唯一的问题是它需要libc++在它构建的系统上.因此libc++分为两步.第一:没有任何ABI兼容性.但它将用于ABI lib的引导,而第二步是libc++使用系统上存在的适当ABI 重新编译:

    Bootstraping => libc++没有适当的ABI 构建:

    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使用libstdc++兼容的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

    libc++使用在系统上部署的适当ABI lib 重建:

    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

  7. 创建一个测试文件以检查一切是否正常.IMO你也应该测试cerr流,因为之前它不支持,libc++abi并且有一些段错误.请参考这个问题.

    创建一个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运行时库.我同意应该有一个涵盖90%案件的方案.可能这只是缺乏资源.搜索邮件存档并没有带来任何特别的东西.

  • 很棒的细节.事实上你必须经历这一切对我来说很奇怪.已经有一个很好的apt-get包用于其他一切,为什么不在其中使用libc ++.我无法相信libc ++开发人员不希望使用他们的东西,但这就是效果.我知道很多公司在Linux上使用clang但没有使用libc ++,因为它不在包中.当然你可以称他们懒惰,但我可以理解为什么他们只是默认使用libstdc ++.实际上他们中的一些甚至没有意识到他们没有使用libc ++,因为他们只是假设它会在那里. (4认同)
  • clang-6.0的注意事项:*将"4.0"和"release_40"替换为"6.0"和"release_50".*`-DLIBCXX_CXX_ABI`和`-DLIBCXX_LIBSUPCXX_INCLUDE_PATHS`不是必需的 (2认同)

Nat*_*iss 12

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

使用LLVM apt 包维护者的脚本:

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

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

clang-13 --version

由于您现在已经从http://apt.llvm.org获得了最新的 LLVM 软件包,因此您可以安装最新的 libc++。首先确定最新版本:

apt search libc++ | grep libc++

然后:

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

或者,您可以使用update-alternatives来让系统使用clang-13默认值。有一个要点:

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
Run Code Online (Sandbox Code Playgroud)

现在:

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
Run Code Online (Sandbox Code Playgroud)


aka*_*ash 9

sudo apt-get update
sudo apt-get install libc++-dev
Run Code Online (Sandbox Code Playgroud)

  • `sudo apt install libc++-dev libc++abi-dev` 对我有用(还需要 ABI 包才能使用 clang 进行编译)。 (6认同)
  • 这给出了 3.7 版本。正如海报所说,相当古老。 (2认同)

Eri*_*cWF 1

获得可用的 libc++ 最简单的方法是将整个 3.9.0 工具链安装在/usr/local. 这将允许 /usr/local/bin/clang++ 正确找到标头,并允许链接器找到 /usr/local/lib/libc++.so。