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

shi*_*eya 4 c++ xcode clang c++11

解决问题=>查看最后的更新

我正在尝试使用,std::function但看起来只是包含<functional>不提供定义.我试图编译以下代码:

#include <functional>
std::function<int(int)> f = nullptr;
Run Code Online (Sandbox Code Playgroud)

使用c ++ 11作为编译选项:

% clang++ -c -std=c++11 t.cc
Run Code Online (Sandbox Code Playgroud)

原因:

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.
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我知道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.
Run Code Online (Sandbox Code Playgroud)

哪里有功能?我想我应该给予-stdlib=libc++11或者其他什么,但它也不起作用:

clang: error: invalid library name in argument '-stdlib=libc++11'
Run Code Online (Sandbox Code Playgroud)

我怎么能找到参数列表-stdlib?(注意:在手册页中,只有可用的选项,libc++而且libstdc++它们都不起作用)

或功能只是不起作用?

小智 6

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

  • 我是唯一一个发现具有讽刺意味的人,苹果公司是易于使用的海报子公司,它有一个编译设置,要求用户告诉编译器使用正确的C++标准库? (2认同)
  • @Casey不,这更具有讽刺意味,因为Apple是LLVM/Clang的头号开发者...... (2认同)

Bre*_*ale 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<functional>.

Howard Hinnant的回答也有类似的问题,他是(IIRC)Apple工程师.