使用Emscripten编译项目时Intel TBB库出现编译错误求助
问题原因分析与解决方案
核心原因
你遇到的错误本质是Emscripten的编译目标环境(WebAssembly/asm.js)未被Intel TBB库的头文件识别,而VS2015编译的是本地x86/x64架构,TBB能正常适配:
- Intel TBB的
tbb_machine.h文件内置了机器字长检查逻辑,但默认只识别常见的本地架构(比如x86、x64、ARM等); - Emscripten编译时会自动定义
__EMSCRIPTEN__宏,但旧版TBB的头文件里没有针对这个宏的判断分支,因此触发了"Unsupported machine word size"的报错。
具体解决方案
1. 升级到支持Emscripten的TBB版本
如果你的TBB是较旧的版本,建议直接切换到Intel oneAPI TBB的最新版本——它已经原生添加了对Emscripten/WebAssembly环境的支持,不需要手动修改头文件就能正常编译。
2. 手动修改TBB头文件适配Emscripten
如果暂时无法升级TBB,可以直接修改报错的tbb_machine.h文件:
找到报错的位置(大概在332行附近的#error Unsupported machine word size代码段),在该代码前添加Emscripten的适配逻辑:
#elif defined(__EMSCRIPTEN__) // 适配Emscripten的WebAssembly环境 #if __SIZEOF_POINTER__ == 8 #define TBB_ARCH_WORD_SIZE 8 // 64位wasm环境 #else #define TBB_ARCH_WORD_SIZE 4 // 32位wasm环境 #endif
3. 调整Emscripten编译命令
编译时需要指定TBB的路径,并且开启线程支持(TBB依赖多线程,Emscripten默认不启用该特性),修改后的编译命令示例:
emcc FaceLandmarkVid.cpp -o OpenFace.js -I./3rdParty/tbb/include -L./3rdParty/tbb/lib -ltbb -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=4
-I指定TBB头文件路径,-L和-ltbb用于链接TBB库;-s USE_PTHREADS=1开启Emscripten的pthread支持,这是TBB正常运行的必要条件;-s PTHREAD_POOL_SIZE=4设置线程池大小,可根据实际需求调整数值。
4. 检查OpenFace项目的编译配置
如果上述步骤仍无法解决问题,确认OpenFace是否有针对Emscripten的编译开关——比如是否可以禁用某些依赖TBB的模块,或者项目的CMake/Makefile脚本是否需要调整以适配Emscripten环境。
内容的提问来源于stack exchange,提问作者JaDoLo
相关产品推荐
相关产品推荐

