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

使用node-gyp绑定jq库时出现未定义符号_Z7jq_init错误求助

解决node-gyp绑定jq库时的undefined symbol: _Z7jq_init错误

问题根源

错误中的_Z7jq_init是C编译器对函数名**名字修饰(name mangling)**后的结果,而libjq库中的jq_init是原生C语言符号。这说明你的Node.js绑定代码(C编写)在引用jq库函数时,没有告知编译器按C语言的符号规则解析,导致生成的目标文件找不到对应的C符号。

解决方案

1. 修改绑定代码,添加extern "C"包裹jq头文件

在你的C++绑定代码(比如.cc文件)中,所有引用jq头文件的部分必须用extern "C"块包裹,示例:

extern "C" {
#include <jq.h>
// 其他jq相关头文件也需放在此块内
}

这个操作会让C++编译器不对jq的函数名进行修饰,生成与libjq库中一致的符号引用。

2. 确认binding.gyp的链接配置正确

检查你的binding.gyp文件,确保link_settings正确指向libjq的库路径和库名:

"targets": [
  {
    "target_name": "jq-node-bindings",
    "sources": [ "src/your-binding-file.cc" ],
    "include_dirs": [
      "<!(node -e \"require('nan')\")",
      "<(module_root_dir)/deps/jq/include"
    ],
    "link_settings": {
      "libraries": [
        "-L<(module_root_dir)/build/deps",
        "-ljq"
      ]
    }
  }
]

确保-L参数指向libjq.so所在的目录,-ljq正确链接目标库文件。

3. 重新构建项目

清理旧的构建产物后重新执行构建流程:

node-gyp clean
node-gyp configure build

验证

构建完成后,可通过以下命令检查绑定模块中的符号是否正确:

nm -g build/Release/jq-node-bindings.node | grep jq_init

此时应能看到未被修饰的jq_init符号,而非_Z7jq_init,之后再次运行index.js即可正常执行。

内容的提问来源于stack exchange,提问作者Daniel Sinai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:55:42