我想知道在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 ++的任何原因也是如此,任何指向安装二进制文件的指针都会感激不尽。
答案 0 :(得分:28)
我和你有类似的问题。虽然使用libstdc ++测试clang在C ++ 11和C ++ 14中运行良好,但libstdc ++仍可能存在许可问题。所以我最后从他们的repos安装了Clang工具链,并在Ubuntu 16.04上编译了libc ++。
免责声明:这篇文章是关于如何在Ubuntu Linux上构建libc++
的长搜索的摘要。我在2017年发现的许多帖子要么过时,要么在其他系统中描述部分解决方案,例如CentOS的。这篇文章的链接是:
以下是从4.0版本开始使用LLVM + Clang + libc ++的步骤:
安装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 -
创建一个新的新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
安装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
为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
结帐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
要在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++
创建一个测试文件以检查一切是否正常。 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;
}
我找到了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