web-dev-qa-db-fra.com

Installer libc ++ sur ubuntu

Je me demande quelle est la bonne façon/facile d'installer une libc ++ binaire sur Ubuntu, dans mon cas Trusty aka 14.04?

Sur le site Web de LLVM, il y a des packages apt http://apt.llvm.org/ et je les ai utilisés pour installer 3.9. Cependant, ces packages ne semblent pas inclure libc ++. J'installe le paquet libc ++ - dev mais cela semble être une version vraiment ancienne. Il existe également des fichiers binaires téléchargeables http://llvm.org/releases/download.html#3.9. . Ceux-ci semblent contenir libc ++ mais je ne sais pas si je peux simplement copier des bits de celui-ci dans des endroits comme/usr/include/c ++/v1, en fait, je ne suis pas vraiment sûr de quels bits je devrais copier. Je suis conscient que je peux utiliser libc ++ à partir d'un autre emplacement comme indiqué ici http://libcxx.llvm.org/docs/UsingLibcxx.html que j'ai essayé. Cependant, je ne peux pas modifier le système de construction de la grande base de code sur laquelle je travaille pour ce faire.

Il en est de même pour trois raisons pour lesquelles les packages apt n'incluent pas libc ++ et tout pointeur vers l'installation d'un binaire serait grandement apprécié.

16
goneskiing

Comment construire libc ++ sur Ubuntu 16.04

J'ai eu un problème similaire au vôtre. Bien que le test de clang avec libstdc ++ ait bien fonctionné avec C++ 11 et C++ 14, il pourrait toujours y avoir des problèmes de licence avec libstdc ++. J'ai donc fini par installer la chaîne d'outils Clang à partir de leurs dépôts et compiler libc ++ sur Ubuntu 16.04.

Avis de non-responsabilité: Ce message est un résumé d'une longue recherche sur la façon de construire le libc++ Sur Ubuntu Linux. Beaucoup de messages que j'ai trouvés en 2017 étaient soit obsolètes, soit décrivaient une solution partielle sur d'autres systèmes, par exemple CentOS. Les liens vers ces articles sont:

Voici les étapes pour construire LLVM + Clang + libc ++ à partir de la branche de publication 4.0:

  1. Installer la clé des référentiels 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. Créez un nouveau APT (vous pouvez également exclure 2 lignes faisant référence à un référentiel 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. Installez Clang et tous les packages nécessaires pour construire libc ++ à partir des dépôts LLVM

    # 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. Créez une alternative pour le compilateur et l'éditeur de liens C++. Ce n'est pas un must, mais vous permet de changer de compilateur ou de lieur si nécessaire. De plus, certains fichiers de construction avaient besoin de cc ou c++ Ou clang++ Pour autant que je m'en souvienne. Gardez à l'esprit que nous passons par défaut à l'éditeur de liens 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. Checkout sources de libc++ Et 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. Pour exécuter libc++ Sous Linux, il faut une compatibilité ABI avec la bibliothèque standard, par ex. libstdc ++. C'est là que libc++abi Entre en jeu. Le seul problème est qu'il a besoin de libc++ Pour être sur le système pour lequel il est construit. Ainsi libc++ Est construit en 2 étapes. Premièrement: sans aucune compatibilité ABI. Mais il sera utilisé pour amorcer la bibliothèque ABI et la deuxième étape consiste à recompiler libc++ Avec l'ABI approprié présent sur le système:

    Bootstraping => build libc++ Sans ABI approprié:

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

    Construire libc++abi Avec ABI compatible avec 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 = -DCMAKE_INSTALL_PREFIX = sortie/usr\-DLLVM_CONFIG_PATH =/usr/bin/llvm-config-4.0\-DLIBCXXABI_LIBCXX_INCLUDES = ../../libcxx/include .. make install

    Reconstruisez libc++ Avec la bonne bibliothèque ABI déployée sur le système:

    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. Créez un fichier de test pour vérifier si tout fonctionne bien. IMO, vous devez également tester le flux cerr, car auparavant il n'était pas pris en charge avec le libc++abi Et il y avait des erreurs de segmentation. Veuillez vous référer à cette question .

    créez un fichier 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; }

    Et compilez-le et exécutez-le en utilisant cette ligne de commande:

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

Raison pour laquelle il n'y a pas de package

J'ai trouvé des packages libc ++ pour Ubuntu mais ils sont un peu en retard par rapport à la version récente: https://packages.ubuntu.com/xenial/libc++-dev

Pourquoi ils ne sont pas à jour, je ne peux pas répondre, mais je suppose que LLVM + Clang peut fonctionner avec la plupart des bibliothèques standard, alors que libc ++ comme vous le voyez doit être lié à un ABI d'exécution particulier et peut dépendre fortement de la bibliothèque d'exécution C disponible . Je suis d'accord qu'il devrait y avoir un paquet qui couvre 90% des cas. Peut-être que c'est juste le manque de ressources. Recherche dans les archives de mailing n'a rien apporté de spécial.

29
ovanes
Sudo apt-get update
Sudo apt-get install libc++-dev
9
akash

Le moyen le plus simple d'obtenir une libc ++ fonctionnelle est d'installer la chaîne d'outils 3.9.0 entière sous /usr/local. Cela permettra à/usr/local/bin/clang ++ de trouver correctement les en-têtes et permettra également à l'éditeur de liens de trouver /usr/local/lib/libc++.so.

1
EricWF