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

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:

  1. 打开node_modules/cld/src/cld.cc文件
  2. 在第5行之前添加头文件引用:
    #include <exception>
    
  3. 重新编译:
    npm rebuild cld
    

内容的提问来源于stack exchange,提问作者kalombo grace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:05:21