Emscripten 中的 C++11 支持

Posted

技术标签:

【中文标题】Emscripten 中的 C++11 支持【英文标题】:C++11 support in Emscripten 【发布时间】:2017-05-08 00:21:33 【问题描述】:

我想使用 Emscripten 编译 C++ 代码,其中我使用了一些 C++11 功能。不幸的是,我收到一个错误:

index.cpp:13:18: error: expected expression
    vv.push_back(1.5f, 2.f);
                 ^
index.cpp:14:18: error: expected expression
    vv.push_back(5.f, 0);
                 ^
index.cpp:15:18: error: expected expression
    vv.push_back(1, 1);
                 ^
index.cpp:17:9: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
    for(auto& item : vv) 
        ^
index.cpp:17:20: warning: range-based for loop is a C++11 extension [-Wc++11-extensions]
    for(auto& item : vv) 

我不明白,为什么会出现这个错误。使用 emsdk 激活最新的 Emscripten 和 Clang 版本。

代码是:

#include<iostream>
#include<vector>

struct AA 
    float a;
    float b;
;

int main() 

    std::vector<AA> vv;

    vv.push_back(1.5f, 2.f);
    vv.push_back(5.f, 0);
    vv.push_back(1, 1);

    for(auto& item : vv) 

        std::cout << item.a << ' ' << item.b << std::endl;

    


我什至收到一条消息:LLVM version appears incorrect (seeing "4.0", expected "3.7")

如果是真的,它应该是可行的,因为“Clang 3.3 及更高版本实现了所有 ISO C++ 2011 标准。”

【问题讨论】:

您使用的是-std=c++11 编译器标志吗?不,如果我理解正确(“警告:'auto' 类型说明符是 C++11 扩展”) 我得到这些错误,即使我添加-Wc++11-extensions max66 告诉你-std=c++11。你为什么对其他一些不相关的开关做出回应?是什么思考过程导致了这个决定? 因为它在编译器日志中。感谢您的帮助。这对我来说是新的,即使在最新的 clang 中我也必须显式启用 C++11 功能 【参考方案1】:

建议:将-std=c++11 添加到您的编译器选项中。

-Wc++11-extensions 是添加警告的标志,而不是添加 C++11 支持。

【讨论】:

哪个Clang版本默认启用了C++11功能?我认为它是从 3.3 开始启用的 @IterAtor:你为什么这么认为?请向我们指出说明它的文档。我在the Clang 3.3 release notes 中看到的只是:“Clang 现在有一个功能完整的 C++11 实现,可以使用 -std=c++11 命令行标志启用”直接与您的主张相矛盾。 @IterAtor - clang 从 2.9 开始支持 C++11(如果我没记错的话),但默认情况下不支持。默认编译C++98;如果你想要 C++11,你必须添加 -std=c++11(或在旧版本上添加 -std=c++0x

以上是关于Emscripten 中的 C++11 支持的主要内容,如果未能解决你的问题,请参考以下文章

EM_JS 无法在 emscripten 中导出函数

使用 IDE 构建 Emscripten 项目?

Emscripten 为未解析的 mcount 符号抛出异常

在 Emscripten C++/wbasm 中,如何获得“页面关闭”事件

如何设置基本的 C++/C 编译,然后为 emscripten 构建链接脚本

Emscripten/NodeJS:使实际的文件系统默认可用