4

問題解決 => 最後にアップデートを参照

使用しようとしていますstd::functionが、インクルードだけでは<functional>定義が提供されないようです。次のコードをコンパイルしようとしました:

#include <functional>
std::function<int(int)> f = nullptr;

コンパイルオプションとして c++11 を使用:

% clang++ -c -std=c++11 t.cc

原因:

t.cc:3:6: error: no type named 'function' in namespace 'std'
std::function<int(int)> f = nullptr;
~~~~~^
t.cc:3:14: error: expected unqualified-id
std::function<int(int)> f = nullptr;
             ^
2 errors generated.

私は何が欠けていますか?C++ はよく知っていますが、clang++/C++11 は初めてなので、重要な知識が不足していると思います。

MacOS X 10.8でclang ++を使用しています。

更新 1

cppreference.com サイトでサンプルを試しましたが、コンパイルもできません。いくつかのオプションを与えることで問題は解決しますか?

更新 2

上記の cppreference.com のサンプルを で試してみましたがclang++ -c -std=c++11 -stdlib=libc++11 x.cc、コンパイラはまだ次のように言っています:

x.cc:1:10: fatal error: 'functional' file not found
#include <functional>
         ^
1 error generated.

機能的なのはどこですか?私は-stdlib=libc++11何かを与えるべきだと思いますが、それも機能しません:

clang: error: invalid library name in argument '-stdlib=libc++11'

の引数のリストを見つけるにはどうすればよい-stdlibですか? (注: man ページでは、利用可能なオプションのみがlibc++あり、libstdc++両方とも機能しません)

または、機能が機能しないだけですか?

4

2 に答える 2

6

これは関数の定義に関するものではありません。リンカー エラーはありません。コンパイラ エラーがあります。問題は、おそらく、実際の sysroot にインストールされている BSD/GNU/Darwin 標準ライブラリが C++11 をサポートしていないことです。-stdlib=libc++コンパイラ フラグを指定して、Clang に付属するものを使用する必要があります。

于 2013-07-25T04:46:34.027 に答える
5

C++11 の場合、常に次のように呼び出すのが最善clangです。clang++ -std=c++11 -stdlib=libc++

ほとんどの場合これを使用するので、環境変数$CXXをこの値に設定します。そうすれば、コンパイルとリンクの両方で方言とライブラリのオプションを取得できます。-std=c++11では不十分です。clang は引き続き (古い) システム gcc ヘッダーを使用するため/usr/include/c++/4.2.1です。

-stdlib=libc++/usr/lib/c++/v1などのclangヘッダーを使用し<functional>ます。

(IIRC) Apple エンジニアである Howard Hinnant による同様の質問があります。

于 2013-07-25T05:53:13.613 に答える