clang ++(3.3 / Xcode)中std :: function的定义在哪里

时间:2013-07-25 04:42:47

标签: c++ xcode c++11 clang

解决问题=>请参阅最后的更新

我正在尝试使用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

我尝试了a sample at cppreference.com site但它也不会编译。提供一些选择解决问题?

更新2

使用clang++ -c -std=c++11 -stdlib=libc++11 x.cc从cppreference.com尝试上面的示例,编译器仍然说:

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++这两个选项都不起作用)

或功能只是不起作用?

2 个答案:

答案 0 :(得分:6)

这与功能的定义无关。您没有链接器错误。您有编译器错误。据推测,问题是安装在真正的sysroot中的BSD / GNU / Darwin标准库不支持C ++ 11。您必须通过指定-stdlib=libc++编译器标志来使用Clang附带的那个。

答案 1 :(得分:5)

对于C ++ 11,最好始终调用clangclang++ -std=c++11 -stdlib=libc++

我大部分时间都在使用它,因此我将环境变量$CXX设置为此值。这样,我在编译和链接中都获得了方言和库选项。 -std=c++11不足,因为clang仍会使用/usr/include/c++/4.2.1中的(旧)系统gcc标题。

-stdlib=libc++将使用/usr/lib/c++/v1中的clang标头,例如<functional>

有一个similar question得到了Howard Hinnant的回答,他是(IIRC)的Apple工程师。