Ubuntuにバイナリlibc ++をインストールする正しい/簡単な方法は何ですか?私の場合はTrusty aka 14.04?
LLVM Webサイトには、aptパッケージ http://apt.llvm.org/ があり、これらを使用して3.9をインストールしました。ただし、これらのパッケージにはlibc ++が含まれていないようです。 libc ++-devパッケージをインストールしますが、それは本当に古いバージョンのようです。ダウンロードできるバイナリもあります http://llvm.org/releases/download.html#3.9. 。これらにはlibc ++が含まれているように見えますが、このビットを/ usr/include/c ++/v1などの場所にコピーできるかどうかはわかりません。実際、どのビットをコピーする必要があるかはわかりません。ここに記載されているように、別の場所からlibc ++を使用できることを知っています http://libcxx.llvm.org/docs/UsingLibcxx.html 試しました。ただし、これを行うために取り組んでいる大規模なコードベースのビルドシステムを変更することはできません。
ですから、aptパッケージにlibc ++が含まれておらず、バイナリをインストールするためのポインタがありがたく受け取られる理由は3つあります。
あなたと同じような問題がありました。 libstdc ++を使用したclangのテストはC++ 11およびC++ 14で正常に機能しましたが、libstdc ++のライセンスに関する問題がまだ残っている可能性があります。そのため、リポジトリから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 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 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
_
LLVMリポジトリからlibc ++をビルドするために必要なClangおよびすべてのパッケージをインストールします
_# 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++
_は2つのステップで構築されます。最初:ABI互換性なし。ただし、ABI libのブートストラップに使用され、2番目のステップは、システムに存在する適切なABIで_libc++
_を再コンパイルすることです。
ブートストラップ=>適切な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 '' ';' A usr/bin/llvm-config-4.0\-DLIBCXXABI_LIBCXX_INCLUDES = ../../libcxx/include .. make install
システムにデプロイされた適切なABI libで_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
_
テストファイルを作成して、すべてが正常に機能するかどうかを確認します。 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%をカバーするパッケージが必要であることに同意します。これは単にリソースの不足かもしれません。 メーリングアーカイブの検索 は、特別なものを表示しませんでした。
Sudo apt-get update
Sudo apt-get install libc++-dev
動作するlibc ++を取得する最も簡単な方法は、/usr/local
の下に3.9.0ツールチェーン全体をインストールすることです。これにより、/ usr/local/bin/clang ++がヘッダーを正しく検索できるようになり、リンカーが/usr/local/lib/libc++.soを検索できるようになります。