在 Ubuntu 16 上使用 clang++ 获取基本的 c++ 程序进行编译
get a basic c++ program to compile using clang++ on 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.
您已经在 ubuntu 16.04 上安装了 libc++-dev
,这是(正确的)期望
让您使用 libc++
及其 headers 构建 clang++
标准库。
它应该,但是在std=c++11
(或更高版本的标准)存在的情况下,它
不会,因为 Debian bug #808086,
你已经 运行 进去了。
如果您希望使用 clang++
编译为 C++11 标准或更高版本,则
在 ubuntu 得到修复之前,您将不得不在没有 libc++
的情况下使用
libstdc++
(GNU C++ 标准库),这是默认行为。
clang++ -std=c++11 foo.cpp
或:
clang++ -std=c++11 -stdlib=libstdc++ foo.cpp
会起作用。
在 Mike Kinghan 的回复中提到的 Debian 错误被修复之前,只需将缺少的(但必需的)noexcept
规范手动添加到 ctor 定义中就可以解决该问题,即您只需添加
#if _LIBCPP_STD_VER <= 14
_NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
#else
_NOEXCEPT
#endif
在 /usr/include/c++/v1/string
的第 1938 行之后。
我 运行 在 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.
您已经在 ubuntu 16.04 上安装了 libc++-dev
,这是(正确的)期望
让您使用 libc++
及其 headers 构建 clang++
标准库。
它应该,但是在std=c++11
(或更高版本的标准)存在的情况下,它
不会,因为 Debian bug #808086,
你已经 运行 进去了。
如果您希望使用 clang++
编译为 C++11 标准或更高版本,则
在 ubuntu 得到修复之前,您将不得不在没有 libc++
的情况下使用
libstdc++
(GNU C++ 标准库),这是默认行为。
clang++ -std=c++11 foo.cpp
或:
clang++ -std=c++11 -stdlib=libstdc++ foo.cpp
会起作用。
在 Mike Kinghan 的回复中提到的 Debian 错误被修复之前,只需将缺少的(但必需的)noexcept
规范手动添加到 ctor 定义中就可以解决该问题,即您只需添加
#if _LIBCPP_STD_VER <= 14
_NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
#else
_NOEXCEPT
#endif
在 /usr/include/c++/v1/string
的第 1938 行之后。