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

如何在Electron应用中打包第三方dylib/dll并解决运行时加载失败问题

解决Electron打包时libndi.dylib加载失败的问题

问题分析

开发模式下native模块能正常调用libndi.dylib,但打包后提示Library not loaded: @rpath/libndi.dylib,核心原因是:

  • 打包后动态库未被包含进应用包;
  • 即使复制进包,native模块的@rpath搜索路径未指向包内的动态库位置。

方案一:electron-builder配置+手动调整rpath

1. 配置electron-builder复制动态库

修改package.json的build字段,使用extraResources将动态库复制到应用包的Contents/Frameworks目录:

"build": {
  "extraResources": [
    {
      "from": "/usr/local/lib/libndi.dylib",
      "to": "Frameworks/"
    }
  ],
  "mac": {
    "target": "dmg"
    // 若开启hardenedRuntime,需额外配置权限,建议先关闭排查
  }
}

2. 修改动态库的Install Name

打包前调整libndi.dylib自身的标识,让它能被@rpath正确识别:

install_name_tool -id @rpath/libndi.dylib /usr/local/lib/libndi.dylib

3. 给native模块添加rpath搜索路径

找到你的native模块(通常在build/Release/xxx.node),添加指向应用包内Frameworks的rpath:

install_name_tool -add_rpath @executable_path/../Frameworks build/Release/your-native-module.node

@executable_path指向应用包Contents/MacOS下的可执行文件,../Frameworks对应Contents/Frameworks目录。


方案二:用electron-builder钩子自动处理

如果不想手动执行命令,可通过afterPack钩子脚本自动完成复制和rpath修改:

  1. 在package.json的build字段添加钩子配置:
"build": {
  "extraResources": [
    {
      "from": "/usr/local/lib/libndi.dylib",
      "to": "Frameworks/"
    }
  ],
  "hooks": {
    "afterPack": "./scripts/after-pack.js"
  }
}
  1. 创建scripts/after-pack.js脚本:
const { execSync } = require('child_process');
const path = require('path');

module.exports = async (context) => {
  const appPath = context.appOutDir;
  // 打包后动态库的路径
  const libPath = path.join(appPath, 'Contents/Frameworks/libndi.dylib');
  // 打包后native模块的路径(替换为你的实际路径)
  const nativeModulePath = path.join(appPath, 'Contents/Resources/app/node_modules/your-native-module/build/Release/your-native-module.node');

  // 修改动态库的install name
  execSync(`install_name_tool -id @rpath/libndi.dylib "${libPath}"`);
  // 给native模块添加rpath
  execSync(`install_name_tool -add_rpath @executable_path/../Frameworks "${nativeModulePath}"`);
};

方案三:通过gyp配置native模块时处理

在native模块的binding.gyp中添加打包后处理逻辑,自动复制动态库并调整rpath:

{
  "targets": [
    {
      "target_name": "your-native-module",
      "sources": ["src/your-module-source.cpp"],
      "libraries": ["-lndi", "-L/usr/local/lib"],
      "postbuild": [
        "cp /usr/local/lib/libndi.dylib <(PRODUCT_DIR)/../libndi.dylib",
        "install_name_tool -id @rpath/libndi.dylib <(PRODUCT_DIR)/../libndi.dylib",
        "install_name_tool -add_rpath @executable_path/../Frameworks <(PRODUCT_DIR)/your-native-module.node"
      ]
    }
  ]
}

之后在electron-builder的extraResources中,将<项目根目录>/build/Release/../libndi.dylib复制到包内Frameworks即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:05:34