2015-06-08 23 views
10

Sto usando travis.ci per fare build test automatici dei miei repository git.clang 3.4 Supporto C++ 14

Per Linux usano: Ubuntu 12.04
Con clangore 3.4

Secondo il clang page tutte le caratteristiche del linguaggio C++ 14 sono supportati da Clang 3.4 (fino a quando si utilizza il flag -std = C++ 1A) .

Fin qui tutto bene:
Ho anche bisogno di utilizzare std::index_sequence<t0,...,tn> che è funzione di libreria N3658 non è una caratteristica del linguaggio. Ma non riesco a trovare alcuna documentazione specifica sull'aggiornamento della libreria standard C++ per verificare che questa funzionalità sia supportata (non è supportata immediatamente).

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. 

Aggiornamento:

Sulla base del suggerimento di seguito ho cercato di utilizzare ++ libc.
Abbastanza sicuro di aver fatto qualcosa di sbagliato, ma non ho mai provato a utilizzare una libreria standard alternativa, quindi non sono sicuro di cosa stia succedendo qui. Scoverò stasera. Ma se hai un suggerimento, per favore lascia un commento.

> 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

Che cosa succede se si utilizza libC++ invece di libstdC++? '-stdlib = libC++' – Praetorian

risposta

3

Bene, la risposta sembra essere quella di installare g ++ - 4.9 Questo aggiornerà le librerie standard già installate in un punto in cui clang sarà in grado di compilare il codice.

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 

Quindi questo è quello che ho aggiunto al travis.yml file di

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 

Dopo che ho consolidare il mio g ++ e clang codice di pre-compilazione ++:

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

Secondo https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html, libstdC++ supporta questa almeno data la versione più recente. Ubuntu 12.04 contiene GCC 4.4, dove ovviamente non è supportato. precise-backports non contiene una versione più recente di libstdC++.

Tuttavia, tramite https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test, è possibile ottenere le versioni più recenti di GCC e con esso, libstdC++. Non so se Travis supporta l'installazione da altri repository, o no, però.

+1

CLang è ** non ** gcc. –

+1

@Serge ma Clang può sicuramente usare e userà libstdC++ se non diversamente specificato .. – rubenvb

+1

@SergeBallesta clang utilizza GNU libstdC++ e le intestazioni di default. Chiaramente non si tratta di un problema del compilatore, ma di una libreria standard. –

Problemi correlati