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

Linux系统下Node-ffi调用C++库遇动态符号查找错误求助

解决node-ffi调用C++库时"undefined symbol"的问题

你遇到的Dynamic Symbol Retrieval Error: undefined symbol: add问题,核心原因是**C编译器的名字修饰(Name Mangling)**导致的——C为了支持函数重载,会对函数名进行特殊编码,生成类似_Z3addii这样的符号,而node-ffi是按照C语言的符号规则去查找add,自然找不到匹配的符号。

下面是具体的解决步骤:

1. 修改代码,用extern "C"导出函数

C++提供了extern "C"语法,让编译器按照C语言的规则生成函数符号,避免名字修饰。你需要修改头文件和实现文件:

修改math.h:

#ifdef __cplusplus
extern "C" {
#endif

// 保持原有的函数声明
int add(int a, int b);
int minus(int a, int b);
int multiply(int a, int b);

#ifdef __cplusplus
}
#endif

修改math.cc(可选,头文件已声明extern "C"时,实现会自动继承C链接):

如果想更明确,也可以把函数定义包裹在extern "C"里:

#include "math.h"

extern "C" {
int add(int x, int y) { return x + y; }
int minus(int x, int y) { return x - y; }
int multiply(int x, int y) { return x * y; }
}

2. 重新构建共享库

先清理旧的构建产物,再重新编译:

node-gyp clean
node-gyp configure build

3. 验证符号是否正确导出

可以用nm工具检查共享库中的符号,确认add、minus、multiply是否以原始名字存在:

nm -D ./build/Release/obj.target/math.so | grep -E "add|minus|multiply"

如果输出类似0000000000001129 T add,说明符号已经正确导出(T表示符号在代码段)。

额外检查点

  • 确认你的binding.gyp配置正确,已经包含了math.cc文件,比如:
    {
      "targets": [
        {
          "target_name": "math",
          "sources": ["math.cc"]
        }
      ]
    }
    
  • 运行test.js时,确保当前工作目录正确,mathlibLoc指向的路径是正确的共享库文件。

按照这些步骤操作后,node-ffi应该就能正常找到并调用C++库中的函数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:08:07