我正在使用node-gyp
and为 C 共享库构建 Node.js 包装器node-addon-api
。有用!但是由于该库是从 Golang 代码构建的,因此我对不同的架构有不同的构建——该模块无法从 Go 源代码本身编译 C 库。
我的问题是,一旦我将库文件移动到 Node 模块内的子目录中,该模块就不再工作了。我希望该库位于子目录中,以便我可以使用条件提供为不同架构构建的副本。
像这样在根目录中的所有文件:
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
这样的:
{
"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
从库返回预期的输出。
当我将库移动到子目录时,如下所示:
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
像这样更新:
{
"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'],
}
]
}
我收到此错误:
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
我已经尝试了libraries
and的所有组合,include_dirs
但无法找到库。