解决问题=>请参阅最后的更新
我正在尝试使用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++
这两个选项都不起作用)
或功能只是不起作用?
答案 0 :(得分:6)
这与功能的定义无关。您没有链接器错误。您有编译器错误。据推测,问题是安装在真正的sysroot中的BSD / GNU / Darwin标准库不支持C ++ 11。您必须通过指定-stdlib=libc++
编译器标志来使用Clang附带的那个。
答案 1 :(得分:5)
对于C ++ 11,最好始终调用clang
:clang++ -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工程师。