Ошибка boost / thread.hpp с ‘clang ++ -std = c ++ 11 -stdlib = libc ++’

При попытке скомпилировать эту строку с помощью clang + libc ++ (режим C ++ 11):

#include <boost/thread.hpp>

clang выдает следующие ошибки:

В файле из test.cpp: 1:
В файле из /Users/yongwei/Programming/boost_1_52_0/boost/thread.hpp:13:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/thread.hpp:17:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/pthread/thread_data.hpp:11:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/locks.hpp:18:
В файле, включенном в /Users/yongwei/Programming/boost_1_52_0/boost/chrono/time_point.hpp:33:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:353:49: ошибка:
Функция constexpr никогда не выдает постоянное выражение
статическое значение BOOST_CHRONO_LIB_CONSTEXPR с плавающей точкой наименьшее () ...
^
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:355:21: note:
функция non-constexpr 'max' не может использоваться в константном выражении
return - (std :: numeric_limits :: max) ();
^
/usr/bin/../lib/c++/v1/limits:443:43: note: объявлено здесь
_LIBCPP_INLINE_VISIBILITY статический тип max () _NOEXCEPT {return ...
^
В файле из test.cpp: 1:
В файле из /Users/yongwei/Programming/boost_1_52_0/boost/thread.hpp:13:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/thread.hpp:17:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/pthread/thread_data.hpp:11:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/locks.hpp:18:
В файле, включенном в /Users/yongwei/Programming/boost_1_52_0/boost/chrono/time_point.hpp:33:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:361:50: ошибка:
Функция constexpr никогда не выдает постоянное выражение
статическое BOOST_CHRONO_LIB_CONSTEXPR двойное наименьшее () ...
^
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:363:21: note:
функция non-constexpr 'max' не может использоваться в константном выражении
return - (std :: numeric_limits :: max) ();
^
/usr/bin/../lib/c++/v1/limits:443:43: note: объявлено здесь
_LIBCPP_INLINE_VISIBILITY статический тип max () _NOEXCEPT {return ...
^
В файле из test.cpp: 1:
В файле из /Users/yongwei/Programming/boost_1_52_0/boost/thread.hpp:13:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/thread.hpp:17:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/pthread/thread_data.hpp:11:
В файл включен из /Users/yongwei/Programming/boost_1_52_0/boost/thread/locks.hpp:18:
В файле, включенном в /Users/yongwei/Programming/boost_1_52_0/boost/chrono/time_point.hpp:33:
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:369:55: ошибка:
Функция constexpr никогда не выдает постоянное выражение
статический BOOST_CHRONO_LIB_CONSTEXPR длинный двойной самый низкий () ...
^
/Users/yongwei/Programming/boost_1_52_0/boost/chrono/duration.hpp:371:21: note:
функция non-constexpr 'max' не может использоваться в константном выражении
return - (std :: numeric_limits :: max) ();
^
/usr/bin/../lib/c++/v1/limits:443:43: note: объявлено здесь
_LIBCPP_INLINE_VISIBILITY статический тип max () _NOEXCEPT {return ...
^
Сгенерировано 3 ошибки.

Мне кажется, это ошибка в libc ++, потому что C ++ 11 требует, чтобы эти функции были constexpr,

Кто-нибудь сталкивался с такой же проблемой, и вы можете согласиться? Знаете ли вы о каких-либо исправлениях?

Моя версия лязга:

Apple clang версия 4.1 (теги / Apple / clang-421.11.66) (на основе LLVM 3.1svn)
Цель: x86_64-apple-darwin11.4.2
Модель потока: posix

2

Решение

С подсказкой Маркса я нашел обходной путь. определяющий BOOST_NO_CXX11_NUMERIC_LIMITS помогает в этом случае. Похоже, что это неполная библиотека libc ++.

Согласно Говарду Хиннанту, это ошибка в libc ++, и она уже исправлена ​​в транке. Однако пока нет информации, когда Apple сможет выпустить исправление в Xcode. Я отмечу вопрос, на который ответили пока.

РЕДАКТИРОВАТЬ: проблема исправлена ​​в Apple LLVM версии 4.2 (clang-425.0.28) (на основе LLVM 3.2svn). Моя текущая версия XCode 4.6.3.

3

Другие решения

я использую boost в xcode 4.3 и использую tr1 random, fisrt также ошибка сборки, но я определил #define BOOST_HAS_TR1_RANDOM 1 перед #include и успешно собрал. Вы можете попробовать аналогичный способ, вручную указать, что у разработчика есть собственная реализация tr1. Возможно, это ошибка встроенного скрипта boost.

2

По вопросам рекламы [email protected]