2016-05-08 11 views
22

Sto incontrando problemi di compilazione su Ubuntu 16.04 LTS (server). Compilare bene se non includo il bit -std=c++11. La versione Clang è 3.8.ottenere un programma C++ di base da compilare usando clang ++ su Ubuntu 16

>cat foo.cpp 
#include <string> 
#include <iostream> 
using namespace std; 

int main(int argc,char** argv) { 
    string s(argv[0]); 
    cout << s << endl; 
} 


>clang++ -std=c++11 -stdlib=libc++ foo.cpp 
In file included from foo.cpp:1: 
/usr/include/c++/v1/string:1938:44: error: 'basic_string<_CharT, _Traits, _Allocator>' is missing exception specification 
     'noexcept(is_nothrow_copy_constructible<allocator_type>::value)' 
basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a) 
             ^
/usr/include/c++/v1/string:1326:40: note: previous declaration is here 
    _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a) 
            ^
1 error generated. 
+0

funziona senza -stdlib = libC++? – xaxxon

+0

Sì, apparentemente. – Darin

+0

quindi raccoglierà le intestazioni libstdC++ e non libC++. Penso che sia normale su una distro linux. – xaxxon

risposta

20

Hai installato libc++-dev su Ubuntu 16.04 nella (corretta) aspettativa che dovrebbe che consentono di creare con clang++ utilizzando libc++ e le sue intestazioni per la vostra libreria standard .

E dovrebbe, ma in presenza di std=c++11 (o norma successiva), è non lo fa, a causa di Debian bug #808086, che avete incontrato.

Se si desidera compilare con clang++ al C++ 11 standard o tardi, quindi fino ubuntu ottiene una correzione per questo si dovrà farlo senza libc++, utilizzando libstdc++ (GNU C++ libreria standard) invece , che è il comportamento predefinito.

clang++ -std=c++11 foo.cpp 

o:

clang++ -std=c++11 -stdlib=libstdc++ foo.cpp 

funzionerà.

+5

Ho riaperto lo stesso bug su Launchpad [qui] (https://bugs.launchpad.net/ubuntu/+source/libc++/+bug/1610168). Mentre in Debian questo è un piccolo inconveniente dato che (ad oggi) spedisce solo Clang 3.8 in experimental, Ubuntu 16.04 viene fornito con Clang 3.8 e una libC++ rotta, che è totalmente pazzesca. – peppe

+0

Ora risolto in 16.04. – peppe

22

Fino a quando il bug Debian menzionato nella risposta di Mike Kinghan è fisso, semplicemente aggiungendo la specifica mancante (ma necessario) noexcept alla definizione ctor permette manualmente per aggirare il problema, cioè si può solo aggiungere

#if _LIBCPP_STD_VER <= 14 
    _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 
#else 
    _NOEXCEPT 
#endif 

dopo la linea 1938 di /usr/include/c++/v1/string.

+9

Si noti che dopo aver apportato questa modifica, ho anche dovuto installare libC++ abi-dev e poi ln -s /usr/include/libcxxabi/__cxxabi_config.h /usr/include/c++/v1/__cxxabi_config.h – Christopher

+0

Interessante, Non ho dovuto farlo con clang 3.8.0-2 sotto Debian Sid. –

+1

Grazie mille per aver fornito questa soluzione alternativa! – MikeMB