Установить libС++ на ubuntu

Мне интересно, какой правильный/простой способ установить двоичный libС++ на Ubuntu, в моем случае Trusty aka 14.04?

На веб-сайте LLVM есть apt-пакеты http://apt.llvm.org/, и я использовал их для установки 3.9. Однако эти пакеты не содержат libС++. Я устанавливаю пакет libС++ - dev, но, похоже, это действительно старая версия. Существуют также двоичные файлы, которые можно загрузить http://llvm.org/releases/download.html#3.9.0. Кажется, что они содержат libС++, но я не уверен, могу ли я просто скопировать бит этого в такие места, как/usr/include/С++/v1, на самом деле я не совсем уверен, какие биты мне нужно будет копировать. Я знаю, что я могу использовать libС++ из альтернативного местоположения, как описано здесь http://libcxx.llvm.org/docs/UsingLibcxx.html, который я пробовал. Однако я не могу изменить систему сборки большой базы кода, над которой я работаю, чтобы сделать это.

Итак, три причины, по которым apt-пакеты не включают libС++, и любые указатели на установку двоичного файла будут с благодарностью получены.

Ответ 1

Как собрать libc++ на Ubuntu 16.04

У меня была такая же проблема, как и у вас. Хотя тестирование clang с libstdc++ работало нормально с C++ 11 и C++ 14, все еще могут быть проблемы с лицензированием с libstdc++. В итоге я установил набор инструментов Clang из их репозиториев и скомпилировал libc++ в Ubuntu 16.04.

Отказ от ответственности: Этот пост является кратким libc++ длительного поиска того, как собрать libc++ на Ubuntu Linux. Многие из постов, которые я нашел в 2017 году, были либо устаревшими, либо описывали частичное решение в других системах, например, CentOS. Ссылки на эти посты:

Вот шаги для сборки LLVM + Clang + libc++ из ветки выпуска 4.0:

  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 и все пакеты, необходимые для сборки libc++ из репозиториев 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. Создайте альтернативу компилятору и компоновщику 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++ и 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++ строится в 2 этапа. Первое: без какой-либо совместимости с ABI. Но он будет использоваться для начальной загрузки ABI-библиотеки, а затем второй шаг - перекомпиляция libc++ с соответствующим ABI, присутствующим в системе:

    Начальная загрузка => сборка 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++ с соответствующей libc++ ABI, развернутой в системе:

    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

Причина нет пакета

Я нашел libc++ пакеты для Ubuntu, но они немного отстают от последней версии: https://packages.ubuntu.com/xenial/libc++-dev

Почему они не актуальны, я не могу ответить, но я предполагаю, что LLVM + Clang может работать в основном с любой стандартной библиотекой, тогда как libc++, как вы видите, должен быть связан с конкретным ABI времени выполнения и может сильно зависеть от доступного C библиотека времени исполнения. Я согласен, что должен быть пакет, который покрывает 90% случаев. Может быть, это просто нехватка ресурсов. Поиск по почтовому архиву не выдвинул ничего особенного.

Ответ 2

sudo apt-get update
sudo apt-get install libc++-dev

Ответ 3

Самый простой способ получить рабочий libС++ - установить целую цепочку инструментов 3.9.0 под /usr/local. Это позволит /usr/local/bin/clang ++ правильно найти заголовки, а также позволить компоновщику найти/usr/local/lib/libС++, поэтому.