1

我正在使用与 Xcode 4.6 一起打包的 clang++ (clang-421.0.60),但遇到了 boost::spirit 的问题。如果我在没有任何标志的情况下编译,一切都编译得很好。如果我使用 '-std=c++11' 编译,则会收到以下错误(包括“boost/spirit/include/qi.hpp”):

In file included from test_spirit11.cpp:1:
In file included from /usr/local/include/boost/spirit/include/qi.hpp:16:
In file included from /usr/local/include/boost/spirit/home/qi.hpp:14:
In file included from /usr/local/include/boost/spirit/home/qi/action.hpp:14:
In file included from /usr/local/include/boost/spirit/home/qi/action/action.hpp:21:
/usr/local/include/boost/spirit/home/support/action_dispatch.hpp:21:10: fatal error: 
  'type_traits' file not found

#include <type_traits>

问题是使用的默认库 (stdlibc++) 将 type_traits 定义为“tr1/type_traits”,而 boost::spirit 只需要“type_traits”。我当然可以通过以下方式解决这个问题:

 clang++ -std=c++11 -stdlib=libc++ <...>

虽然我很想使用 libc++,但这样做的实用性很困难(许多库仍然使用并依赖于 stdlibc++)。因此,我被迫不使用 libc++。

有人对如何处理这个问题有任何建议吗?我真的希望更多的库维护者支持 libc++,或者 Apple 提供更新版本的 stdlibc++。能够访问新的 c++11 功能,但由于缺乏库支持而无法完全使用它们是一个很大的挫折。

4

2 回答 2

4

问题是使用的默认库(stdlibc++)

它被称为 libstdc++

将 type_traits 定义为 'tr1/type_traits',而 boost::spirit 只需要 'type_traits'。

<tr1/type_traits>不是一回事,它完全是一个不同的标题。boost::spirit想要 C++11 标头<type_traits>,它是一个不同的标头(尽管它们确实包含一些类似的功能,在不同的命名空间中。)

问题可能是您使用的是 Apple 不支持 C++11 的旧版 GCC (4.2) 附带的 libstdc++。

如果您想使用 C++11,您需要将 clang 与 libc++ 一起使用,或者安装更新的 GCC 以获得更新的 libstdc++。出于许可原因,Apple 不会提供更新的 GCC,但您可以自己安装它并告诉 Xcode 如何找到标头和库。

于 2013-01-01T16:43:40.193 回答
0

如果您不想在 boost 中使用 C++11 功能,可以禁用它。
编辑 boost clang.hpp 来管理特性。
例如,要禁用type_traits文件未找到错误,您可以添加到末尾:

#define BOOST_NO_VARIADIC_TEMPLATES
于 2013-08-21T14:14:22.933 回答