clang++ (3.3/Xcode) 中 std::function 的定义在哪里
Posted
技术标签:
【中文标题】clang++ (3.3/Xcode) 中 std::function 的定义在哪里【英文标题】:Where is definition of std::function in clang++ (3.3/Xcode) 【发布时间】:2013-07-25 04:42:47 【问题描述】:问题已解决 => 见最后更新
我正在尝试使用 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++
可用的选项都不起作用)
或者只是功能不起作用?
【问题讨论】:
你编译成C++11了吗? 你通过-std=c++11
了吗?
正如你在上面看到的命令行,我正在传递 -std=c++11。
@H2CO3 我今天可能比平时慢了一点。
是的,我知道。尝试了 libc++、libstdc++,然后确保我尝试了 libc++11(作为最后的手段),因为除了手册页之外我找不到任何列表。
【参考方案1】:
这与函数的定义无关。您没有链接器错误。你有一个编译器错误。问题大概是安装在真正的 sysroot 中的 BSD/GNU/Darwin 标准库不支持 C++11。您必须通过指定 -stdlib=libc++
编译器标志来使用 Clang 附带的那个。
【讨论】:
@shigeya 我可以区分链接和编译,我向你保证。这就是为什么我说“这与定义无关”。这是关于声明的。 (好吧,严格来说,定义也可能在标题中,因为std::function
是一个类模板,但你明白我的意思。)
@shigeya 这是一个特定于 OS X 的解决方案;据我所知,GNU glibc++ 和 g++ 支持 C++11,无需任何进一步的黑客攻击。请注意,您可能必须安装最新版本的开发工具 - 检查 Xcode 中的更新,如果可用,请安装最新的“命令行工具”包。
只有我一个人觉得讽刺的是,Apple 这个易于使用的典型子公司有一个编译设置,要求用户告诉编译器使用正确的 C++ 标准库?
谢谢。正如我在更新的问题中所写,-stdlib=libc++
对我没有帮助。命令行工具已更新。我同意这很讽刺。
@shigeya 如果我理解正确,您仍然无法正常工作。现在尝试将-isysroot <DEVROOT>
传递给编译器,其中DEVROOT 是开发系统根目录,位于/Applications/Xcode.app 中的某个位置,它被称为MacOSX10.8.sdk
。【参考方案2】:
对于 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 由 Apple 工程师 (IIRC) Howard Hinnant 提供答案。
【讨论】:
谢谢。不幸的是,我仍然找不到<functional>
。我更新了问题。
@shigeya - 如果没有解决问题,你为什么接受答案?
@jww 因为答案部分解决了问题。请注意,“功能”部分是作为更新的一部分添加的。以上是关于clang++ (3.3/Xcode) 中 std::function 的定义在哪里的主要内容,如果未能解决你的问题,请参考以下文章
默认情况下,clang 中是不是有一组已知的 `c++11` 功能不需要`-std=c++11`?
std::bind 与 std::function 与 Clang 崩溃
clang 5:std::optional 实例化参数类型的 std::is_constructible 特征