【发布时间】:2020-11-23 14:51:10
【问题描述】:
我已将我的节点从 v8.16.2 更新到 v12.18.3。 当我现在尝试加载我的插件时,我遇到了这个错误:
$ /usr/bin/node -e "require('/home/user1/addon.node')"
internal/modules/cjs/loader.js:1187
return process.dlopen(module, path.toNamespacedPath(filename));
^
Error: /home/user1/addon.node: undefined symbol:
_ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE
at Object.Module._extensions..node (internal/modules/cjs/loader.js:1187:18)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at [eval]:1:1
at Script.runInThisContext (vm.js:120:18)
at Object.runInThisContext (vm.js:309:38)
at Object.<anonymous> ([eval]-wrapper:10:26)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
我发现这个未定义的符号 _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE 以前在节点二进制文件本身中定义(在节点 v8 中更新到节点 v12 之前)。
我没有改变我构建节点的方式。那就是脚本“配置”的参数没有改变,它们对于节点 v8 和节点 v12 都是相同的。
但是,现在这个缺失的符号不再在节点 v12 的节点二进制文件中定义。有谁知道为什么会这样?
对于节点 v12,此符号未定义:
$ readelf -Ws node | grep _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE
(no any output)
对于节点 v8,定义了这个符号:
$ readelf -Ws node |grep _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE
66565: 00000000005167a8 84 FUNC GLOBAL DEFAULT 13 _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE
为什么节点 v12 中不再定义此符号?
谢谢你, 阿列克谢。
【问题讨论】:
-
版本 8 和 12 之间有很多变化。听起来您正在使用 nan 构建插件。也许添加更多关于您是否使用 nan、n-api 或 node-addon-api 的信息会有所帮助。如果您使用的是 nan,那么您需要更新您正在使用的 nan 版本。
-
FWIW, c++filt 将去错名显示为:v8::Function::NewInstance(int, v8::Local<:>*) 常量
标签: node.js node.js-addon