Подтвердить что ты не робот

Получить базовую программу С++ для компиляции с помощью clang++ на Ubuntu 16

Я столкнулся с проблемой компиляции на Ubuntu 16.04 LTS (сервер). Он компилируется, если я не добавлю бит -std=c++11. Версия Clang - 3.8.

>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.
4b9b3361

Ответ 1

Вы установили libc++-dev на ubuntu 16.04 в (правильное) ожидание, что оно должно для создания с помощью clang++ с помощью libc++ и его заголовков для вашего стандартная библиотека.

Он должен, но в присутствии std=c++11 (или более позднего стандарта), он не из-за Ошибка Debian # 808086, с которыми вы столкнулись.

Если вы хотите скомпилировать с clang++ стандартом С++ 11 или позже, тогда пока ubuntu не получит исправление, вам придется сделать это без libc++, используя libstdc++ (стандартная библиотека GNU С++), которая является поведением по умолчанию.

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

или

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

будет работать.

Ответ 2

Пока ошибка с Debian, упомянутая в Mike Kinghan, не исправлена, просто добавление отсутствующей (но требуемой) спецификации noexcept в определение ctor вручную позволяет обойти проблему, т.е. вы можете просто добавить

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

после строки 1938 из /usr/include/c++/v1/string.