问题
I am having trouble getting even a simple hello world to compile with clang if I enable c++11 and libc++. For example the following code
#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
Produces the following output from the compile when I run clang++ -std=c++11 -stdlib=libc++ main.cpp
In file included from main.cpp:1:
In file included from /usr/bin/../lib/c++/v1/iostream:38:
In file included from /usr/bin/../lib/c++/v1/ios:216:
In file included from /usr/bin/../lib/c++/v1/__locale:15:
In file included from /usr/bin/../lib/c++/v1/string:434:
In file included from /usr/bin/../lib/c++/v1/algorithm:591:
/usr/bin/../lib/c++/v1/type_traits:165:12: error: unknown type name
'_LIBCPP_CONSTEXPR'
static _LIBCPP_CONSTEXPR const _Tp value = __v;
^
/usr/bin/../lib/c++/v1/type_traits:165:30: error: expected member name or ';'
after declaration specifiers
static _LIBCPP_CONSTEXPR const _Tp value = __v;
~~~~~~~~~~~~~~~~~~~~~~~~ ^
/usr/bin/../lib/c++/v1/type_traits:169:9: error: unknown type name
'_LIBCPP_CONSTEXPR'
_LIBCPP_CONSTEXPR operator value_type() const {return value;}
^
/usr/bin/../lib/c++/v1/type_traits:169:63: error: use of undeclared identifier
'value'
_LIBCPP_CONSTEXPR operator value_type() const {return value;}
^
/usr/bin/../lib/c++/v1/type_traits:173:1: error: unknown type name
'_LIBCPP_CONSTEXPR'
_LIBCPP_CONSTEXPR const _Tp integral_constant<_Tp, __v>::value;
^
/usr/bin/../lib/c++/v1/type_traits:173:19: error: expected unqualified-id
_LIBCPP_CONSTEXPR const _Tp integral_constant<_Tp, __v>::value;
^
/usr/bin/../lib/c++/v1/type_traits:730:2: error: is_base_of not implemented.
#error is_base_of not implemented.
^
/usr/bin/../lib/c++/v1/type_traits:400:56: error: no member named 'value' in
'std::__1::is_integral<void>'
: public integral_constant<bool, is_integral<_Tp>::value ||
~~~~~~~~~~~~~~~~~~^
/usr/bin/../lib/c++/v1/type_traits:941:19: note: in instantiation of template
class 'std::__1::is_arithmetic<void>' requested here
(is_arithmetic<_A2>::value || is_void<_A2>::value) &&
^
/usr/bin/../lib/c++/v1/type_traits:949:22: note: in instantiation of default
argument for '__promote<type-parameter-0-0, void, void>' required here
typedef typename __promote<_A1>::type __type1;
^~~~~~~~~~~~~~
/usr/bin/../lib/c++/v1/type_traits:949:38: error: expected a qualified name
after 'typename'
typedef typename __promote<_A1>::type __type1;
^
/usr/bin/../lib/c++/v1/type_traits:949:42: error: expected ';' at end of
declaration list
typedef typename __promote<_A1>::type __type1;
^
/usr/bin/../lib/c++/v1/type_traits:941:39: error: no member named 'value' in
'std::__1::is_arithmetic<void>'
(is_arithmetic<_A2>::value || is_void<_A2>::value) &&
~~~~~~~~~~~~~~~~~~~~^
/usr/bin/../lib/c++/v1/type_traits:950:22: note: in instantiation of default
argument for '__promote<type-parameter-0-1, void, void>' required here
typedef typename __promote<_A2>::type __type2;
^~~~~~~~~~~~~~
/usr/bin/../lib/c++/v1/type_traits:950:38: error: expected a qualified name
after 'typename'
typedef typename __promote<_A2>::type __type2;
^
/usr/bin/../lib/c++/v1/type_traits:950:42: error: expected ';' at end of
declaration list
typedef typename __promote<_A2>::type __type2;
^
/usr/bin/../lib/c++/v1/type_traits:941:39: error: no member named 'value' in
'std::__1::is_arithmetic<void>'
(is_arithmetic<_A2>::value || is_void<_A2>::value) &&
~~~~~~~~~~~~~~~~~~~~^
/usr/bin/../lib/c++/v1/type_traits:951:38: error: expected a qualified name
after 'typename'
typedef typename __promote<_A3>::type __type3;
^
/usr/bin/../lib/c++/v1/type_traits:951:42: error: expected ';' at end of
declaration list
typedef typename __promote<_A3>::type __type3;
^
/usr/bin/../lib/c++/v1/type_traits:953:22: error: use of undeclared identifier
'__type1'
typedef decltype(__type1() + __type2() + __type3()) type;
^
/usr/bin/../lib/c++/v1/type_traits:953:34: error: use of undeclared identifier
'__type2'
typedef decltype(__type1() + __type2() + __type3()) type;
^
/usr/bin/../lib/c++/v1/type_traits:953:46: error: use of undeclared identifier
'__type3'
typedef decltype(__type1() + __type2() + __type3()) type;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
The code will compile fine if I use xcode and set the options for libc++ and c++11 support.
Thank you for any replies
回答1:
Your command-line tools are out of date. Clang 4.0 shipped with Xcode 4.4. You want Clang 4.1, which ships with Xcode 4.5. After installing Xcode, you can go to the Preferences window, select the Downloads pane, and the Components tab, and there's an entry for "Command Line Tools". There will be a button on the right side that says "Install".
来源:https://stackoverflow.com/questions/13752233/using-clang-with-libc-and-c11-from-the-command-line-with-mac-os-x