2016-05-08 26 views
22

üzerinde clang ++ kullanarak derlemek için basit bir C++ programı olsun Ubuntu 16.04 LTS (sunucu) üzerinde derleme sorunlara koşuyorum. -std=c++11 bit içermezse tamamlanır. Clang versiyonu 3.8. Bunu Eğer clang++ sizin standart kütüphane için libc++ ve başlıklarını kullanarak yapalım etmesi gerektiği düşünülürse (doğru) beklenti içinde ubuntu 16.04 üzerinde libc++-dev yüklemiş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

-stdlib = libC++ olmadan çalışır mı? – xaxxon

+0

Evet, görünüşte. – Darin

+0

böylece libcdC++ üstbilgileri toplayıp libC++ değil. Bence bu bir linux dağıtımında normal. – xaxxon

cevap

20

.

O gerektiğini, ancak std=c++11 varlığında (veya daha standartta) 'de, bu yapar olmasın, içine çalıştırmak nedeniyle Debian bug #808086, .

kullanmakta, C++ 11 standart veya ubuntu bunun için bir düzeltme alıncaya kadar sonra, daha sonra sen libc++ olmadan bunu zorunda kalacaktır için clang++ ile derlemek istiyorsanız libstdc++ (GNU C++ standart kitaplık) yerine varsayılan davranış budur.

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

ya:

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

çalışacaktır. Mike Kinghan en cevapta belirtilen Debian hata giderilinceye kadar

+5

Aynı hatayı Launchpad'de tekrar açtım (burada) (https://bugs.launchpad.net/ubuntu/+source/libc++/+bug/1610168). Debian'da (bugün itibariyle) bu küçük bir rahatsızlık iken, deneysel olarak sadece Clang 3.8'i gönderiyor, Ubuntu 16.04 ise Clang 3.8 ve kırık bir libC++. – peppe

+0

Bu şimdi 16.04'te sabitlenmiştir. – peppe

22

, sadece elle soruna olanak ctor tanımına eksik (ama gerekli) noexcept şartname ekleyerek sadece ekleyebilirsiniz yani

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

/usr/include/c++/v1/string hattı 1938'den sonra.

+9

Bu değişikliği yaptıktan sonra, libC++ abi-dev ve daha sonra ln -s /usr/include/libcxxabi/__cxxabi_config.h /usr/include/c++/v1/__cxxabi_config.h – Christopher

+0

'u yüklemem gerektiğini de unutmayın. Bunu Debian Sid'in 3.8.0-2 clang ile yapmak zorunda değildim. –

+1

Bu geçici çözümü sağladığınız için çok teşekkür ederiz! – MikeMB