Clang 3.4 支持 C++14

10

我正在使用 travis.ci 对我的git仓库进行自动化测试构建。

对于Linux,它们使用:Ubuntu 12.04
以及clang 3.4。

根据clang页面,Clang 3.4支持所有C ++ 14语言特性(只要您使用-std=c++1y标志)。

目前为止都很好:
我还需要使用std::index_sequence<t0,...,tn>,这是库功能N3658,而不是语言功能。但我找不到有关更新clang的C ++标准库以确保支持此功能的任何具体文档(默认情况下不支持该功能)。

测试代码:

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

测试构建:

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

5
如果你使用-stdlib=libc++而不是libstdc++,会发生什么? - Praetorian
2个回答

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
CLang 不是 gcc。 - Serge Ballesta
1
@Serge,但是Clang绝对可以并且会使用libstdc++,除非另有指示。 - rubenvb
1
@SergeBallesta clang 默认使用 GNU libstdc++ 和头文件。显然这不是编译器问题,而是标准库的问题。 - Stefano Sanfilippo
@StefanoSanfilippo:没错。我的评论只是希望答案能更明确一些。 - Serge Ballesta
我修改了我的答案,使其更加清晰。谢谢提醒。 - Technaton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接