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++ と呼ばれます

'tr1/type_traits' として定義された type_traits を持っていますが、boost::spirit は 'type_traits' だけを想定しています。

<tr1/type_traits>は同じものではなく、まったく別のヘッダーです。boost::spirit別のヘッダーであるC++11 ヘッダー<type_traits>が必要です (ただし、異なる名前空間にいくつかの同様の機能が含まれています)。

問題はおそらく、C++11 をサポートしていない Apple の古いバージョンの GCC (4.2) に付属している libstdc++ を使用していることです。

C++11 を使用する場合は、libc++ で clang を使用するか、新しい GCC をインストールして新しい libstdc++ を取得する必要があります。Apple はライセンス上の理由から新しい GCC を提供しませんが、自分でインストールして、ヘッダーとライブラリを見つける方法を Xcode に伝えることができます。

于 2013-01-01T16:43:40.193 に答える
0

ブーストで C++11 機能を使用したくない場合は、無効にすることができます。
機能を管理するには、boost clang.hpp を編集します。
たとえば、type_traitsファイルが見つからないというエラーを無効にするには、最後に次を追加できます。

#define BOOST_NO_VARIADIC_TEMPLATES
于 2013-08-21T14:14:22.933 に答える