You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emscripten编译报错:'tr1/unordered_map'文件未找到的问题咨询及解决方案求助

解决Emscripten编译时找不到tr1/unordered_map的问题

为什么会出现这个错误?

Emscripten基于Clang工具链,默认支持C11及更高版本的标准。tr1/unordered_map是C11正式发布前,为让开发者提前试用哈希表这类新特性推出的过渡性头文件,属于TR1技术报告范畴。C++11落地后,unordered_map被纳入标准库的std命名空间,对应头文件直接是<unordered_map>,现代编译器(包括Emscripten的Clang)不再提供tr1路径下的头文件——这就是编译报错的核心原因。

你之前在g中依赖tr1/unordered_map,应该是因为当时使用的g版本默认未开启C11支持,旧版g需要手动指定-std=c++11才能使用标准std::unordered_map,所以才会遇到“unordered_map does not name a type”的错误,转而使用tr1版本。但Emscripten的环境不需要这种妥协。

修复步骤

  1. 替换头文件
    把代码中的#include<tr1/unordered_map>替换为标准C++11头文件:

    #include <unordered_map>
    
  2. 修正命名空间
    如果代码中之前用的是std::tr1::unordered_map,直接改成std::unordered_map即可。

  3. 编译时明确C++标准(可选但推荐)
    虽然Emscripten默认已启用C++11,但为避免潜在兼容性问题,编译时可显式指定标准版本,比如:

    emcc test.cpp -s WASM=1 -std=c++11 -o TRY.html
    

    若需要使用C++17等更高版本特性,可替换为-std=c++17。

修改后的示例代码

// this is test.cpp
#include<iostream>
#include<string.h>
#include<fstream>
#include<unordered_map> // 替换为标准头文件
#include "C:\Users\<myusername>\Documents\PROGRAMMING\examplefolder\pugixml-1.11\src\pugixml.hpp"
#include <ctime>
#include <chrono>
int main() {
    std::cout<<"DIS IS DA TEST";
    // 示例:使用标准的std::unordered_map
    std::unordered_map<int, std::string> demo_map;
    demo_map[42] = "wasm works!";
    return 0;
}

额外说明

如果旧代码中有大量std::tr1相关用法,理论上可以尝试用-std=c++03参数编译兼容,但非常不推荐——C03已过时,Emscripten对C11及以后版本的支持更完善,且现代C++特性能大幅提升代码可读性与效率,建议逐步迁移到标准写法。

内容的提问来源于stack exchange,提问作者Varghese George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:19:10