Emscripten编译报错:'tr1/unordered_map'文件未找到的问题咨询及解决方案求助
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的环境不需要这种妥协。
修复步骤
替换头文件
把代码中的#include<tr1/unordered_map>替换为标准C++11头文件:#include <unordered_map>修正命名空间
如果代码中之前用的是std::tr1::unordered_map,直接改成std::unordered_map即可。编译时明确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

