2016-05-08 15 views
22

Występują problemy podczas kompilacji na Ubuntu 16.04 LTS (serwer). Kompiluje się dobrze, jeśli nie dodaję bita -std=c++11. Wersja Clang to 3.8.uzyskać podstawowy program C++ do kompilacji za pomocą clang ++ na 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

czy działa bez -stdlib = libC++? – xaxxon

+0

Tak, najwyraźniej. – Darin

+0

, więc to jest pobieranie nagłówków libstdC++, a nie libC++. Myślę, że to normalne w dystrybucji Linuksa. – xaxxon

Odpowiedz

20

Zainstalowane libc++-dev na ubuntu 16.04 w (prawidłowe) oczekiwanie, że powinna ona pozwolić budować z użyciem libc++clang++ i jego nagłówków dla biblioteki standardowej.

To powinien, ale w obecności std=c++11 (lub później standard), to nie z powodu Debian bug #808086, które zostały napotkasz.

Jeśli chcesz skompilować z clang++ do standardu C++ 11 lub później, a następnie aż ubuntu dostaje poprawkę na to, że będzie musiał to zrobić bez libc++ korzystając libstdc++ (GNU C++ biblioteki standardowej) zamiast , co jest domyślnym zachowaniem.

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

czyli

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

zadziała.

+5

Ponownie otworzyłem ten sam błąd na Launchpad [tutaj] (https://bugs.launchpad.net/ubuntu/+source/libc++/+bug/1610168). Podczas gdy w Debianie jest to niewielka niedogodność, ponieważ (na dzień dzisiejszy) dostarcza tylko Clang 3.8 w wersji eksperymentalnej, Ubuntu 16.04 pochodzi z Clang 3.8 i uszkodzoną biblioteką libC++, która jest całkowicie szalona. – peppe

+0

Zostało to poprawione w 16.04. – peppe

22

Dopóki błędów Debiana wspomniano w odpowiedzi Mike'a Kinghan jest stała, wystarczy dodać brakujące (ale wymagane) specyfikację noexcept definicji konstruktor ręcznie pozwala obejść ten problem, czyli można po prostu dodać

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

po linii 1938 z /usr/include/c++/v1/string.

+9

Należy zauważyć, że po wprowadzeniu tej zmiany musiałem również zainstalować libC++ abi-dev, a następnie ln -s /usr/include/libcxxabi/__cxxabi_config.h /usr/include/c++/v1/__cxxabi_config.h – Christopher

+0

Interesujące, Nie musiałem tego robić z clang 3.8.0-2 w Debianie Sid. –

+1

Dziękuję bardzo za zapewnienie tego obejścia! – MikeMB