2

尝试使用 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:注意:
  非 constexpr 函数 'max' 不能在常量表达式中使用
    返回 -(std::numeric_limits::max) ();
        ^
/usr/bin/../lib/c++/v1/limits:443:43:注意:在这里声明
_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:注意:
  非 constexpr 函数 'max' 不能在常量表达式中使用
    返回 -(std::numeric_limits::max) ();
        ^
/usr/bin/../lib/c++/v1/limits:443:43:注意:在这里声明
_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:注意:
  非 constexpr 函数 'max' 不能在常量表达式中使用
    返回 -(std::numeric_limits::max)();
        ^
/usr/bin/../lib/c++/v1/limits:443:43:注意:在这里声明
_LIBCPP_INLINE_VISIBILITY 静态类型 max() _NOEXCEPT {return ...
                      ^
产生 3 个错误。

在我看来这是 libc++ 中的一个错误,因为 C++11 确实要求这些函数是constexpr.

有人遇到过同样的问题,你能同意吗?你知道任何修复吗?

我的clang版本是:

Apple clang 版本 4.1 (tags/Apple/clang-421.11.66) (基于 LLVM 3.1svn)
目标:x86_64-apple-darwin11.4.2
线程模型:posix
4

2 回答 2

3

在马克思的暗示下,我找到了一种解决方法。在这种情况下,定义会有所BOOST_NO_CXX11_NUMERIC_LIMITS帮助。所以这似乎是 libc++ 的不完整。

根据 Howard Hinnant 的说法,这是 libc++ 的一个错误,并且已经在主干上修复了。然而,目前还没有关于 Apple 何时可以将修复程序发布到 Xcode 中的信息。我将标记现在已回答的问题。

编辑:该问题已在 Apple LLVM 4.2 版(clang-425.0.28)(基于 LLVM 3.2svn)中得到修复。我当前的 Xcode 版本是 4.6.3。

于 2013-01-14T13:18:22.460 回答
2

我在 xcode 4.3 中使用 boost,并使用 tr1 random,fisrt 也构建错误,但我在 #include 之前定义了 #define BOOST_HAS_TR1_RANDOM 1 并成功构建。你可以尝试类似的方法,手动指出构建器有它自己的 tr1 实现。这可能是 boost 的构建脚本的错误。

于 2013-01-13T03:15:26.957 回答