C++ -std= C++11 -stdlib=libC++, выдающий ошибки на osx lion

Это должен быть повторяющийся вопрос. Но я немного погуглил и не нашел хита, который решает мою проблему.

Я пытаюсь использовать стандартную функцию C++11 на OSX LION, и она не работает. Я считаю, что эта функция называется списком инициализаторов. в соответствии с http://clang.llvm.org/cxx_status.html Эта функция была в Clang 3.1, которая является версией, которую я использую.

Ниже приведена оболочка о / п, объясняющая мой простой тест. Может кто-нибудь сказать мне, что я делаю не так? Я забыл флаг?

Компилятор:

:tmp$ c++ --version
Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix
:tmp$ which c++
/usr/bin/c++
:tmp$ ls -alt /usr/bin/c++
lrwxr-xr-x  1 root  wheel  7 Jul 12 13:17 /usr/bin/c++ -> clang++

ОС есть

:tmp$ uname -a
Darwin .local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64

Тестовый файл

:tmp$ cat test.cpp
#include <vector>

int main(){
  std::vector<int> vec1 {1,2,3};
  std::vector<int> vec2={1,2,3};
}

Вывод компилятора

:tmp$ c++ -std=c++11 test.cpp
 test.cpp:4:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec1 {1,2,3};
                   ^    ~~~~~~~
test.cpp:5:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec2={1,2,3};
                   ^    ~~~~~~~
2 errors generated.

Хорошо, я не хотел этого делать, потому что для правильного форматирования в stackru требуется много времени. Но добавление -stdlib= C++ создает еще больше проблем. Теперь я получаю 14 ошибок.

:tmp$ c++ -std=c++11 -stdlib=libc++ test.cpp 
In file included from test.cpp:1:
In file included from /usr/bin/../lib/c++/v1/vector:261:
In file included from /usr/bin/../lib/c++/v1/__bit_reference:15:
In file included from /usr/bin/../lib/c++/v1/algorithm:591:
/usr/bin/../lib/c++/v1/type_traits:737:2: error: #error is_base_of not
      implemented.
#error is_base_of not implemented.
 ^
/usr/bin/../lib/c++/v1/type_traits:1700:13: error: use of undeclared identifier
      'is_base_of'
            is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
            ^
/usr/bin/../lib/c++/v1/type_traits:1700:24: error: '_Class' does not refer to a
      value
            is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
                   ^
/usr/bin/../lib/c++/v1/type_traits:1697:28: note: declared here
template <class _Rp, class _Class, class _Tp>
                           ^
/usr/bin/../lib/c++/v1/type_traits:1700:62: error: expected class name
            is_base_of<_Class, typename remove_reference<_Tp>::type>::value>
                                                             ^
In file included from test.cpp:1:
In file included from /usr/bin/../lib/c++/v1/vector:261:
In file included from /usr/bin/../lib/c++/v1/__bit_reference:15:
In file included from /usr/bin/../lib/c++/v1/algorithm:594:
In file included from /usr/bin/../lib/c++/v1/memory:590:
In file included from /usr/bin/../lib/c++/v1/typeinfo:61:
/usr/bin/../lib/c++/v1/exception:194:20: error: use of undeclared identifier
      'is_base_of'
                  !is_base_of<nested_exception, typename ...
               ^
/usr/bin/../lib/c++/v1/exception:194:31: error: 'nested_exception' does not
      refer to a value
                  !is_base_of<nested_exception, typename ...
                              ^
/usr/bin/../lib/c++/v1/exception:166:29: note: declared here
class _LIBCPP_EXCEPTION_ABI nested_exception
                            ^
/usr/bin/../lib/c++/v1/exception:194:81: error: parameter declarator cannot be
      qualified
  ...typename remove_reference<_Tp>::type>::value
                                   ~~^
/usr/bin/../lib/c++/v1/exception:194:85: error: expected ')'
  ...typename remove_reference<_Tp>::type>::value
                                         ^
/usr/bin/../lib/c++/v1/exception:192:18: note: to match this '('
throw_with_nested(_Tp&& __t, typename enable_if<
                 ^
/usr/bin/../lib/c++/v1/exception:213:19: error: use of undeclared identifier
      'is_base_of'
                  is_base_of<nested_exception, typename ...
              ^
/usr/bin/../lib/c++/v1/exception:213:30: error: 'nested_exception' does not
      refer to a value
                  is_base_of<nested_exception, typename ...
                         ^
/usr/bin/../lib/c++/v1/exception:166:29: note: declared here
class _LIBCPP_EXCEPTION_ABI nested_exception
                            ^
/usr/bin/../lib/c++/v1/exception:213:80: error: parameter declarator cannot be
      qualified
  ...typename remove_reference<_Tp>::type>::value
                                   ~~^
/usr/bin/../lib/c++/v1/exception:213:84: error: expected ')'
  ...typename remove_reference<_Tp>::type>::value
                                         ^
/usr/bin/../lib/c++/v1/exception:211:18: note: to match this '('
throw_with_nested(_Tp&& __t, typename enable_if<
                 ^
test.cpp:4:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec1 {1,2,3};
                   ^    ~~~~~~~
test.cpp:5:20: error: non-aggregate type 'std::vector<int>' cannot be
      initialized with an initializer list
  std::vector<int> vec2={1,2,3};
                   ^    ~~~~~~~
14 errors generated.

3 ответа

Решение

Решение

В частности, мне пришлось перейти в настройки XCode-> Загрузки и установить "Инструменты командной строки". Это решило проблему.

Объяснение

То, что произошло, было простым случаем устаревшего программного обеспечения. Поскольку OSX был обновлен (благодаря обновлению программного обеспечения), я предположил, что все обновления XCode и компилятора также имеются. Что было не так.

Обратите внимание в комментарии на вопрос, который я сказал: "У меня последняя версия XCode для Lion". Но я этого не сделал (bames53 ссылается на это в своем ответе) То, что у вас нет новых обновлений в обновлении программного обеспечения OSX, не означает, что у вас установлен последний компилятор XCode. Вы обновляете его через настройки XCode.

С помощью отзывов Джонатана и еще одного поиска в Google, использование clang с libC++ и C++11 из командной строки с mac os x решило мою проблему.

Это фактически обновило цепочку инструментов llvm.

$ c++ --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix

Версия, которую вы используете:

Apple clang version 3.1 (tags/Apple/clang-318.0.61) (based on LLVM 3.1svn)

Хотя здесь написано "3.1", на самом деле это не то же "3.1", на которое ссылается страница состояния C++, на которую вы смотрели. Версии Apple и версии LLVM.org практически не связаны.

Apple clang версии 3.1 "основана на LLVM 3.1svn", что означает, что она основана на предварительной версии "LLVM.org 3.1" в репозитории исходного кода LLVM.org и может не иметь всех возможностей финальной версии LLVM.org 3.1.

Apple Clang 3.1 уже устарел. С тех пор LLVM.org выпустил релизы "3.1" и "3.2", а Apple - до "Apple clang 4.1", я думаю. Вам следует либо обновить Xcode, либо посмотреть, есть ли более свежая версия clang, установленная где-то еще.

Добавлять -stdlib=libc++ на флаги вашего компилятора. Смотрите этот пост для объяснения.

Другие вопросы по тегам