首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用node-addon-api链接共享库

使用node-addon-api链接共享库
EN

Stack Overflow用户
提问于 2021-09-20 23:03:04
回答 1查看 217关注 0票数 0

我正在使用node-gypnode-addon-api为C共享库构建一个Node.js包装器。它起作用了!但是,由于该库是从Golang代码构建的,所以我为不同的体系结构构建了不同的版本--该模块不能从Go源代码本身编译C库。

我的问题是,一旦我将库文件移动到Node模块内的子目录中,该模块就不再工作。我希望库在一个子目录中,这样我就可以提供使用条件为不同架构构建的副本。

所有文件都在根目录中,如下所示:

代码语言:javascript
复制
node-mylib/
┣ build/
┃ ┣ Release/
┃ ┃ ┣ .deps/
┃ ┃ ┃ ┗ Release/
┃ ┃ ┃   ┣ obj.target/
┃ ┃ ┃   ┗ mylib.node.d
┃ ┃ ┣ obj.target/
┃ ┃ ┃ ┗ mylib/
┃ ┃ ┃   ┗ mylib.o
┃ ┃ ┗ mylib.node
┃ ┣ Makefile
┃ ┣ binding.Makefile
┃ ┣ config.gypi
┃ ┣ mylib.target.mk
┃ ┗ gyp-mac-tool
┣ binding.gyp
┣ mylib.cc
┣ index.js
┣ libmylib.h
┣ libmylib.so
┣ package-lock.json
┗ package.json

和一个像这样的binding.gyp

代码语言:javascript
复制
{
  "targets": [
    {
      "conditions": [
        ['OS=="mac"', {
            'cflags+': ['-fvisibility=hidden'],
            'xcode_settings': {
              'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
            }
        }]
      ],
      "defines": [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
      "include_dirs": ["<(module_root_dir)", "<!(node -p \"require('node-addon-api').include_dir\")"],
      "target_name": "mylib",
      "sources": [ "mylib.cc" ],
      "libraries": [ "-Wl,-rpath,<(module_root_dir)", '-lmylib', '-L<(module_root_dir)'],
    }
  ]
}

..。然后,node-gyp rebuild可以正常运行,node index.js将从库中返回预期的输出。

当我将库移动到子目录中时,如下所示:

代码语言:javascript
复制
node-biodiversity/
┣ build/
┃ ┣ Release/
┃ ┃ ┣ .deps/
┃ ┃ ┃ ┗ Release/
┃ ┃ ┃   ┣ obj.target/
┃ ┃ ┃   ┗ mylib.node.d
┃ ┃ ┣ obj.target/
┃ ┃ ┃ ┗ mylib/
┃ ┃ ┃   ┗ macos-arm64/
┃ ┃ ┃     ┗ mylib.o
┃ ┃ ┗ mylib.node
┃ ┣ Makefile
┃ ┣ binding.Makefile
┃ ┣ config.gypi
┃ ┣ mylib.target.mk
┃ ┗ gyp-mac-tool
┣ macos-arm64/
┃ ┣ mylib.cc
┃ ┣ libmylib.h
┃ ┗ libmylib.so
┣ binding.gyp
┣ index.js
┣ package-lock.json
┗ package.json

并像这样更新binding.gyp

代码语言:javascript
复制
{
  "targets": [
    {
      "conditions": [
        ['OS=="mac"', {
            'cflags+': ['-fvisibility=hidden'],
            'xcode_settings': {
              'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
            }
        }]
      ],
      "defines": [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
      "include_dirs": ["<(module_root_dir)", "<(module_root_dir)/macos-arm64", "<!(node -p \"require('node-addon-api').include_dir\")"],
      "target_name": "mylib",
      "sources": [ "macos-arm64/mylib.cc" ],
      "libraries": [ "-Wl,-rpath,<(module_root_dir)/macos-arm64", '-lmylib', '-L<(module_root_dir)/macos-arm64'],
    }
  ]
}

我得到了这个错误:

代码语言:javascript
复制
Error: dlopen(/Users/toby/Code/node-mylib/build/Release/mylib.node, 1): Library not loaded: libmylib.so
  Referenced from: /Users/toby/Code/node-mylib/build/Release/mylib.node
  Reason: image not found

我尝试了librariesinclude_dirs的每一种组合,但都找不到库。

EN

回答 1

Stack Overflow用户

发布于 2021-09-22 00:18:26

我能让它正常工作的唯一方法是在一个node-gyp postbuild中使用install_name_tool

代码语言:javascript
复制
{
  "targets": [
    {
      "conditions": [
        ['OS=="mac"', {
            'cflags+': ['-fvisibility=hidden'],
            'xcode_settings': {
              'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
            }
        }]
      ],
      "defines": [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
      "include_dirs": ["<(module_root_dir)/macos-arm64", "<!(node -p \"require('node-addon-api').include_dir\")"],
      "target_name": "mylib",
      "sources": [ "macos-arm64/mylib.cc" ],
      "libraries": ['<(module_root_dir)/macos-arm64/libmylib.so'],
      "postbuilds": [
        {
          "postbuild_name": 'Change libmylib load path',
          "action": ['install_name_tool', '-change',  'libmylib.so', '@loader_path/../../macos-arm64/libmylib.so', '<(PRODUCT_DIR)/mylib.node'],
        },
      ],
    }
  ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69261685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档