【问题标题】:clang's support of C++ 11 lambdaclang 对 C++ 11 lambda 的支持
【发布时间】:2012-11-01 07:24:31
【问题描述】:

我有这个使用 lambda 的 C++ 11 代码,这是一个示例。

#include <iostream>

using namespace std;

int main()
{
    auto func = [] () { cout << "Hello world"; };
    func(); // now call the function
}

当我用 clang 3.1 (Apple clang version 3.1 (tags/Apple/clang-318.0.54) (based on LLVM 3.1svn)) 编译这段代码时,我得到了这个错误

lambda.cpp:7:17: error: expected expression
auto func = [] () { cout << "Hello world"; };

可能出了什么问题?在this site 中,clang 3.1 似乎支持 lambda。

添加

使用 -std=gnu++11 或 c++11 选项,我收到了这些错误消息。

0.      Program arguments: /usr/bin/clang -cc1 -triple x86_64-apple-macosx10.7.4 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name lambda.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 128.2 -resource-dir /usr/bin/../lib/clang/3.1 -fmodule-cache-path /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/clang-module-cache -std=gnu++11 -fdeprecated-macro -fdebug-compilation-dir /Users/smcho/Desktop/C++test -ferror-limit 19 -fmessage-length 173 -stack-protector 1 -fblocks -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-dispatch-method=mixed -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/lambda-XvZzHg.o -x c++ lambda.cpp 
1.      lambda.cpp:7:49: current parser token ';'
2.      lambda.cpp:6:1: parsing function body 'main'
3.      lambda.cpp:6:1: in compound statement ('{}')
clang: error: unable to execute command: Segmentation fault: 11
clang: error: clang frontend command failed due to signal 2 (use -v to see invocation)
clang: note: diagnostic msg: Please submit a bug report to http://developer.apple.com/bugreporter/ and include command line arguments and all diagnostic information.
clang: note: diagnostic msg: Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/lambda-roTwCZ.ii
clang: note: diagnostic msg: /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/lambda-roTwCZ.sh

【问题讨论】:

  • 编译的时候有没有使用-std=c++11?
  • 阅读编辑后的答案,看看是否有帮助。
  • 看起来clang本身失败了。尝试更新 Xcode 或从 MacPorts 安装 mainline clang 3.1。

标签: c++ c++11 lambda clang


【解决方案1】:

这是因为 clang++ by default compiles your code using ISO C++ 1998 standard (including the defects addressed in the ISO C++ 2003 standard) except for 'export' (which has been removed in C++11)

Lambda 是 Clang's C++11 Language Extension 的一部分,因此您需要使用 -std=c++11-std=gnu++11 编译代码>

另请参阅:Clang 3.1 and C++11 support statusActivating C++11 support in Clang

编辑:我认为您正在尝试使用 C 编译器 (clang) 而不是 C++ 编译器 (clang++) 或您的 Clang 安装未链接到 libclibstdc++。尝试链接每个库以查看哪个适合您,可能 libc 可能未安装在您的系统上。

尝试使用 clang++ 可执行文件(C++ 编译器)以 C++11 模式编译您的程序,并将其与 Clang C++ Standard LibraryGNU Standard C++ Library 链接

1)

# Uses Clang C++ Library and enables C++11 mode
clang++ -stdlib=libc++ -std=c++11 [input] 

2)

# Uses GNU Standard C++ Library and enables C++11 mode
clang++ -stdlib=libstdc++ -std=c++11 [input]

另一个可能的问题可能是您没有使用正确的选项编译 Clang 以启用 C++11 语言扩展,请尝试检查文档以了解在为 Clang 配置编译过程时要使用的正确标志。

【讨论】:

  • 布拉瓦。这解决了我的问题。仅添加 -std=c++11 标志不起作用,但添加 -stdlib=libc++ 标志后,它现在就像魅力一样。
【解决方案2】:

Xcode 已使用 AppStore 更新,但它仍然在我的 Mac (Lion 10.7.5) 上崩溃

我可以下载 macport 以成功编译示例。

sudo port install clang-3.1
clang++-mp-3.1 -std=c++11 lambda.cpp 

【讨论】:

  • headdesk 我怎么会错过这个?很高兴你明白了。
  • tags/Apple/clang-318 是与 Xcode 4.3 一起分发的 clang 版本。 Xcode 4.5 带有标签/Apple/clang-421。你确定你的 Xcode 是最新的吗?
【解决方案3】:

回复新编辑的帖子:

我对这个问题进行了一些调查,这是一个在 clang 3.1 的发布版本中得到纠正的错误。我目前正在使用:

Debian clang version 3.1-3eudoxos1 (branches/release_31) (based on LLVM 3.1)

但是,当我使用 clang 3.0-6ubuntu3 进行测试时,我收到了与您发布的类似的错误。

因为您的版本是从 SVN 标记的,所以我认为您的问题是它来自 3.1 的预发布版本,并且尚未完全实现 lambda 支持。

我可以确认 lambda 确实在 clang 中工作,因为我正在开发一个使用它们的项目,并且我们同时针对 clang 和 gcc。不时会出现一些编译器问题。但是,当然,没有什么比您给出的示例更简单了。

所以,我的建议是更新您的 clang 版本。

【讨论】:

    【解决方案4】:

    我需要按照这篇文章的说明安装命令行工具 - Does Xcode 4.4 come with subversion?

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 2015-03-01
      • 2012-05-23
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      相关资源
      最近更新 更多