Получить базовую программу С++ для компиляции с помощью 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.
Ответы
Ответ 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
.