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

Node.js C++ Addon调用微软语音SDK报未定义符号错误

问题背景

业务需要向Node.js版本的microsoft-speech-sdk传入MULAW(g711)格式音频实现语音转写,由于Node.js版SDK原生不支持MULAW流式音频格式,需要结合C环境下的GStreamer做格式处理,因此通过开发Node.js C Addon实现该功能。
前置操作已完成:参考微软官方C++ Speech SDK的Ubuntu平台安装文档完成SDK部署,Addon开发参考streaming-worker开源项目的accumulate示例代码实现,在Ubuntu 18.04 Server环境运行服务时抛出如下符号查找错误:

1|server  | node /home/*****Transation/server.js: symbol lookup error: /home/*****Transation/stream-translation/cpp_asr/build/Release/accumulate.node: undefined symbol: speech_config_from_subscription
排查思路
  • 优先确认编译阶段链接配置正确性:undefined symbol错误的本质是Addon被Node加载时,动态链接器无法找到对应函数的实现地址,首先检查binding.gyp编译配置中,是否正确配置了微软Speech SDK的头文件搜索路径、库文件搜索路径、核心库链接声明,确认没有漏链SDK核心库。
  • 校验SDK版本与接口的匹配性:报错提到的speech_config_from_subscription属于Speech SDK的C层API,若本地安装的SDK版本过旧,或者编译时引用的头文件版本与实际链接的库文件版本不一致,会出现库中不存在对应导出符号的问题。可直接执行nm -D <你的SDK部署路径>/libMicrosoft.CognitiveServices.Speech.core.so | grep speech_config_from_subscription检查目标so文件是否导出该符号,无输出则证明库本身不包含该接口,属于版本不匹配问题。
  • 检查运行时动态库加载路径:即使编译阶段链接配置正确,如果运行时系统找不到对应版本的SDK动态库,或者优先加载了其他路径下的旧版SDK库,同样会触发符号查找错误。可执行ldd /home/*****Transation/stream-translation/cpp_asr/build/Release/accumulate.node查看Addon所有依赖库的实际加载路径,确认Speech SDK对应的库文件指向你自行部署的正确版本,不存在not found或者指向系统预装旧版本的情况。
  • 排查编译符号可见性配置:如果Addon编译时开启了-fvisibility=hidden这类默认隐藏符号的编译选项,且未对Speech SDK的接口做可见性声明,也会导致符号解析异常,需确认binding.gyp中的cflags、cflags_cc配置没有错误修改符号可见性规则。
可行解决方案
  • 修正binding.gyp编译配置,补充正确的链接规则与运行时库加载配置,参考配置片段如下:
{
  "targets": [
    {
      "target_name": "accumulate",
      "sources": ["src/accumulate.cpp"],
      "include_dirs": [
        # 替换为本地实际的Speech SDK头文件路径
        "/opt/speechsdk/include/c_api",
        "<!@(node -p \"require('node-addon-api').include\")"
      ],
      "libraries": [
        # 替换为本地实际的Speech SDK库文件路径
        "-L/opt/speechsdk/lib/x64",
        "-lMicrosoft.CognitiveServices.Speech.core"
      ],
      "cflags_cc": ["-fexceptions", "-std=c++17"],
      "conditions": [
        ["OS=='linux'", {
          "ldflags": ["-Wl,-rpath,'$$ORIGIN'"],
          "copies": [{
            "destination": "<(PRODUCT_DIR)",
            "files": ["/opt/speechsdk/lib/x64/libMicrosoft.CognitiveServices.Speech.core.so"]
          }]
        }]
      ]
    }
  ]
}

配置中添加的rpath和copies规则,会在编译时把SDK核心so文件直接拷贝到Addon产物同目录,运行时优先加载同目录下的库文件,避免系统路径下的版本冲突。

  • 统一SDK版本:如果本地部署的SDK版本低于1.30,先卸载原有版本,安装1.30及以上版本的C++ Speech SDK,保证编译时引用的头文件和链接的库文件来自同一安装包,避免头文件声明了接口但库文件无对应实现的问题。
  • 临时配置动态库搜索路径:如果不想将SDK库文件拷贝到Addon目录,可在启动Node服务前执行export LD_LIBRARY_PATH=/opt/speechsdk/lib/x64:$LD_LIBRARY_PATH,将SDK库路径加入系统动态库搜索优先级列表后再启动服务。
  • 替换接口调用方式:如果C层API持续出现链接异常,可直接调用SDK的C上层接口SpeechConfig::FromSubscription创建语音配置,C接口在核心库中的导出兼容性比C层API更稳定,可减少版本适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:48:11