Node v10.24.1执行npm install报错:std相关标识符未声明
解决cld@2.5.1在Node.js v10下编译报错:std::terminate_handler未声明的问题
问题背景
项目基于Node.js v10.24.1、Hapi.js和Handlebars构建,用nvm管理多Node版本。当前使用Node v10.24.1 + npm 6.14.12,执行npm install时,cld@2.5.1包在node-gyp rebuild阶段报错,核心错误为:
../src/cld.cc:5:12: error: ‘terminate_handler’ has not been declared in ‘std’ ../src/cld.cc:6:12: error: ‘unexpected_handler’ has not been declared in ‘std’
已尝试的无效操作
- 执行
npm cache clean --force清理缓存 - 删除node_modules和package-lock.json,确认Node版本为v10、npm为v6后重新安装
- 彻底卸载Node.js和npm并重装
完整报错日志
npm i npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but npm-shrinkwrap.json was generated for lockfileVersion@0. I'll try to do my best with it! > cld@2.5.1 install /home/grace/Desktop/music-c/node_modules/cld > node-gyp rebuild make: Entering directory '/home/grace/Desktop/music-c/node_modules/cld/build' CXX(target) Release/obj.target/cld-c/deps/cld/internal/cldutil.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cldutil_shared.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/compact_lang_det.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/compact_lang_det_hint_code.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/compact_lang_det_impl.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/debug.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/fixunicodevalue.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/generated_entities.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/generated_language.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/generated_ulscript.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/getonescriptspan.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/lang_script.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/offsetmap.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/scoreonescriptspan.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/tote.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/utf8statetable.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld_generated_cjk_uni_prop_80.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_cjk_compatible.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld_generated_cjk_delta_bi_32.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/generated_distinct_bi_0.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_quad0122.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_deltaocta0122.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_deltaoctachrome.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_distinctocta0122.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_distinctoctachrome.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_quadchrome_16.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld2_generated_quadchrome_2.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld_generated_score_quad_octa_0122.o CXX(target) Release/obj.target/cld-c/deps/cld/internal/cld_generated_score_quad_octa_2.o AR(target) Release/obj.target/deps/cld/cld-c.a COPY Release/cld-c.a CXX(target) Release/obj.target/cld/src/constants.o CXX(target) Release/obj.target/cld/src/cld.o ../src/cld.cc:5:12: error: ‘terminate_handler’ has not been declared in ‘std’ 5 | using std::terminate_handler; | ^~~~~~~~~~~~~~~~~ ../src/cld.cc:6:12: error: ‘unexpected_handler’ has not been declared in ‘std’ 6 | using std::unexpected_handler; | ^~~~~~~~~~~~~~~~~~ In file included from ../../nan/nan.h:60, from ../src/cld.cc:8: /home/grace/.cache/node-gyp/10.24.1/include/node/node.h:573:7: warning: cast between incompatible function types from ‘void (*)(v8::Local<v8::Object>)’ to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type] 573 | (node::addon_register_func) (regfunc), \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /home/grace/.cache/node-gyp/10.24.1/include/node/node.h:607:3: note: in expansion of macro ‘NODE_MODULE_X’ 607 | NODE_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage) | ^~~~~~~~~~~~~ ../src/cld.cc:158:3: note: in expansion of macro ‘NODE_MODULE’ 158 | NODE_MODULE(cld, init); | ^~~~~~~~~~~ In file included from /home/grace/.cache/node-gyp/10.24.1/include/node/node.h:63, from ../../nan/nan.h:60, from ../src/cld.cc:8: /home/grace/.cache/node-gyp/10.24.1/include/node/v8.h: In instantiation of ‘void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)]’: /home/grace/.cache/node-gyp/10.24.1/include/node/node_object_wrap.h:84:25: required from here /home/grace/.cache/node-gyp/10.24.1/include/node/v8.h:9502:16: warning: cast between incompatible function types from ‘v8::WeakCallbackInfo<node::ObjectWrap>::Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)’} to ‘Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<void>&)’} [-Wcast-function-type] 9502 | reinterpret_cast<Callback>(callback), type); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /home/grace/.cache/node-gyp/10.24.1/include/node/v8.h: In instantiation of ‘void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = Nan::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)]’: ../../nan/nan_object_wrap.h:64:57: required from here /home/grace/.cache/node-gyp/10.24.1/include/node/v8.h:9502:16: warning: cast between incompatible function types from ‘v8::WeakCallbackInfo<Nan::ObjectWrap>::Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)’} to ‘Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<void>&)’} [-Wcast-function-type] make: *** [cld.target.mk:111: Release/obj.target/cld/src/cld.o] Error 1 make: Leaving directory '/home/grace/Desktop/music-c/node_modules/cld/build' gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/home/grace/.nvm/versions/node/v10.24.1/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:191:23) gyp ERR! stack at ChildProcess.emit (events.js:198:13) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12) gyp ERR! System Linux 5.15.0-53-generic gyp ERR! command "/home/grace/.nvm/versions/node/v10.24.1/bin/node" "/home/grace/.nvm/versions/node/v10.24.1/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" gyp ERR! cwd /home/grace/Desktop/music-c/node_modules/cld gyp ERR! node -v v10.24.1 gyp ERR! node-gyp -v v5.1.0 gyp ERR! not ok npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules/fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"}) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! cld@2.5.1 install: `node-gyp rebuild` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the cld@2.5.1 install script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
解决方案
1. 降级C++编译器
报错根源是cld@2.5.1依赖旧版C标准库特性,而新GCC(10+)在C17及以后移除了std::terminate_handler和std::unexpected_handler的全局声明。
- 安装GCC 9(兼容旧标准):
sudo apt install gcc-9 g++-9 - 用指定编译器安装依赖:
CC=gcc-9 CXX=g++-9 npm install
2. 升级或替换cld包
- 升级cld版本:修改package.json中cld版本为
^2.9.1(经测试兼容Node.js v10),然后重新执行npm install - 替换为纯JS替代包:如果升级不可行,改用
detect-language或langdetect这类无需编译的语言检测包,避免node-gyp编译问题
3. 手动修改cld源码临时修复
如果必须使用cld@2.5.1:
- 打开
node_modules/cld/src/cld.cc文件 - 在第5行之前添加头文件引用:
#include <exception> - 重新编译:
npm rebuild cld
内容的提问来源于stack exchange,提问作者kalombo grace
相关产品推荐
相关产品推荐

