clang 3.4 C++14 支持
clang 3.4 C++14 support
我正在使用 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++ 标准库以确保支持此功能的特定文档(开箱即用不支持)。
测试代码:
#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.
根据https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html, libstdc++ supports this at least given the most recent version. Ubuntu 12.04 contains GCC 4.4,这显然不受支持。 precise-backports
不包含较新版本的 libstdc++。
但是,通过 https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test,可以获得较新版本的 GCC 及其 libstdc++。不过,我不知道 Travis 是否支持从其他存储库安装。
嗯答案似乎是安装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
我正在使用 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++ 标准库以确保支持此功能的特定文档(开箱即用不支持)。
测试代码:
#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.
根据https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html, libstdc++ supports this at least given the most recent version. Ubuntu 12.04 contains GCC 4.4,这显然不受支持。 precise-backports
不包含较新版本的 libstdc++。
但是,通过 https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test,可以获得较新版本的 GCC 及其 libstdc++。不过,我不知道 Travis 是否支持从其他存储库安装。
嗯答案似乎是安装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