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?(注意:在手册页中,只有可用选项是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 仍将在/usr/include/c++/4.2.1.

-stdlib=libc++将在/usr/lib/c++/v1诸如<functional>.

苹果工程师 (IIRC) 的 Howard Hinnant 回答了一个类似的问题。

于 2013-07-25T05:53:13.613 回答