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 &lt;DEVROOT&gt; 传递给编译器,其中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 标头,例如 &lt;functional&gt;

有一个 similar question 由 Apple 工程师 (IIRC) Howard Hinnant 提供答案。

【讨论】:

谢谢。不幸的是,我仍然找不到&lt;functional&gt;。我更新了问题。 @shigeya - 如果没有解决问题,你为什么接受答案? @jww 因为答案部分解决了问题。请注意,“功能”部分是作为更新的一部分添加的。

以上是关于clang++ (3.3/Xcode) 中 std::function 的定义在哪里的主要内容,如果未能解决你的问题,请参考以下文章

clang 忽略包含文件的 -std=c++11 标志

默认情况下,clang 中是不是有一组已知的 `c++11` 功能不需要`-std=c++11`?

std::bind 与 std::function 与 Clang 崩溃

clang 5:std::optional 实例化参数类型的 std::is_constructible 特征

std::experimental::对于 ndk/clang 是可选的

如何使用自动工具编译带有 clang 和选项 -std=c++11 的项目