clang 3.4 C ++ 14支持

时间:2015-06-08 16:11:15

标签: c++ c++14 clang++

我正在使用travis.ci来完成我的git存储库的自动测试版本。

对于Linux,他们使用:Ubuntu 12.04
用clang 3.4

根据clang page,Clang 3.4支持所有C ++ 14语言功能(只要你使用-std = c ++ 1y标志)。

到目前为止很好:
我还需要使用std::index_sequence<t0,...,tn>这是图书馆功能N3658而不是语言功能。但是我找不到任何关于为clang更新C ++标准库的具体文档,以确保支持此功能(开箱即用不支持)。

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.

更新

根据下面的建议,我尝试使用libc ++ 我确实做错了什么,但我从未尝试过使用替代标准库,所以我不确定这里出了什么问题。将在今晚挖掘。但如果您有任何建议,请发表评论。

> 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.

2 个答案:

答案 0 :(得分:3)

答案似乎是安装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文件

的内容
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 ++预构建代码之后:

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

答案 1 :(得分:1)

根据https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html,libstdc ++至少在最新版本的支持下支持这一点。 Ubuntu 12.04包含GCC 4.4,显然不支持此功能。 precise-backports不包含较新版本的libstdc ++。

然而,通过https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test,可以获得更新版本的GCC及其libstdc ++。不过,我不知道特拉维斯是否支持从其他存储库安装。