Подтвердить что ты не робот

Clang 3.4 Поддержка С++ 14

Я использую travis.ci для выполнения автоматических тестовых сборников моих репозиториев git.

Для linux они используют: Ubuntu 12.04
С clang 3.4

В соответствии с clang page все функции языка С++ 14 поддерживаются Clang 3.4 (если вы используете -std = С++ 1y).

До сих пор так хорошо:
Мне также нужно использовать std::index_sequence<t0,...,tn>, который является функцией библиотеки N3658, а не функцией языка. Но я не могу найти какую-либо конкретную документацию по обновлению стандартной библиотеки С++ для clang, чтобы убедиться, что эта функция поддерживается (она не поддерживается из коробки).

TestCode:

#include <utility>
int main() {
    std::index_sequence<1,2,3,4>    seq;
}

TestBuild:

> clang++ -std=c++1y pl.cpp
pl.cpp:3:10: error: no member named 'index_sequence' in namespace 'std'
    std::index_sequence<1,2,3,4>    seq;
    ~~~~~^
pl.cpp:3:37: error: use of undeclared identifier 'seq'
    std::index_sequence<1,2,3,4>    seq;
                                    ^
2 errors generated.

Update:

На основании приведенного ниже предложения я попытался использовать libС++.
Довольно уверен, что я сделал что-то не так, но я никогда не пытался использовать альтернативную стандартную библиотеку, поэтому не уверен, что здесь происходит не так. Будет digg сегодня. Но если у вас есть предложение, пожалуйста, оставьте комментарий.

> sudo apt-get install -qq libc++1 libc6 libc++-dev

> clang++ -stdlib=libc++ pl.cpp
pl.cpp:1:10: fatal error: 'utility' file not found
#include <utility>
         ^
1 error generated.
4b9b3361

Ответ 1

Ну, похоже, ответ заключается в установке g++ - 4.9 Это обновит стандартные библиотеки, которые уже установлены, до того момента, когда clang сможет скомпилировать код.

sudo apt-get install python-software-properties
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9

## Because I also use llvm-cov from my makefile
## I have to make sure it is in the path.
a=$(sudo find / -name llvm-cov | head -1)
sudo ln -s ${a} /usr/bin/llvm-cov

Итак, это то, что я добавил в travis.yml file

before_install:
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "clang++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "clang++" ]; then sudo apt-get update;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "clang++" ]; then sudo apt-get install g++-4.9;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "clang++" ]; then a=$(sudo find / -name llvm-cov | head -1);sudo ln -s ${a} /usr/bin/llvm-cov;fi

После того, как я консолидирую свой код g++ и clang++ pre-build:

before_install:
    - if [ "$TRAVIS_OS_NAME" == "linux"];                         then sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y;fi
    - if [ "$TRAVIS_OS_NAME" == "linux"];                         then sudo apt-get update;fi
    - if [ "$TRAVIS_OS_NAME" == "linux"];                         then sudo apt-get install -qq g++-4.9;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "g++" ];     then sudo update-alternatives --install /usr/bin/gcc  gcc  /usr/bin/gcc-4.9  90;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "g++" ];     then sudo update-alternatives --install /usr/bin/g++  g++  /usr/bin/g++-4.9  90;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "g++" ];     then sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.9 90;fi
    - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CXX" == "clang++" ]; then a=$(sudo find / -name llvm-cov | head -1);sudo ln -s ${a} /usr/bin/llvm-cov;fi

Ответ 2

Согласно https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html, libstdС++ поддерживает это, по крайней мере, с учетом последней версии. Ubuntu 12.04 содержит GCC 4.4, где это явно не поддерживается. precise-backports не содержит более новую версию libstdС++.

Однако через https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test можно получить более новые версии GCC и с ним, libstdС++. Я не знаю, поддерживает ли Travis установку из других репозиториев или нет.