我正在尝试使用node-gyp
链接静态库,以便将其用作本机node
插件。但是,当我运行node-gyp rebuild
时,出现以下链接错误:
error LNK2001: unresolved external symbol "double __cdecl mylibengine::criticalZvalue(double)" (?criticalZvalue@mylibengine@@YANN@Z)
紧随其后的是:
C:\Users\Mihai\Desktop\msp-addon\build\Release\mylib-addon.node : fatal error LNK1120: 1 unresolved externals [C:\Users\Mihai\Desktop\mylib-addon\build\mylib-addon.vcxproj
binding.gyp
如下:
{
'targets': [{
'target_name': 'mylib-addon',
'cflags!': [ '-fno-exceptions' ],
'cflags_cc!': [ '-fno-exceptions' ],
'include_dirs': [
'<!@(node -p \"require(\'node-addon-api\').include\")',
'<(module_root_dir)/dependencies/mylib/include/'
],
'sources': [
'src/MyLibNode.cpp'
],
'dependencies': [
'<!(node -p \"require(\'node-addon-api\').gyp\")'
],
'libraries': [
'<(module_root_dir)/dependencies/mylib/lib/x64/libmylib.a'
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ]
}]
}
MyLibNode.cpp
看起来像这样:
#include <napi.h>
#include "engine.h"
Napi::Object InitAll(Napi::Env env, Napi::Object exports)
{
// Temporary check to make sure `libmylib.a` works.
mylibengine::criticalZvalue(.3);
return exports;
}
NODE_API_MODULE(mspaddon, InitAll)
我确定链接器可以找到libmylib.a
,因为当我更改库名(例如,更改为disabled.a
)时,我收到另一个错误,提示无法打开输入文件。但是,无法解析外部符号。
我找到了一个类似的未解决问题here。对其他问题的回答表明将完整的库路径添加到libraries
,但是我认为这不是我的情况的问题。
为什么node-gyp
无法解析外部符号?
其他信息:
g++
一起使用,我测试了该库是否正常工作我具有以下项目结构:
├───build
└───dependencies
└───mylib
├───include
└───lib
└───x64
dependencies/mylib/include
内部,我有一个名为engine.h
的头文件,其中包含:#pragma once
namespace mylibengine
{
double criticalZvalue(double quantile);
}
dependencies/mylib/lib/x64
内,我有一个名为libmylib.a
的静态库main.cpp
的文件,其中包含:#include <iostream>
#include <engine.h>
int main()
{
std::cout << "Main working." << "\n";
std::cout << mylibengine::criticalZvalue(.3) << "\n";
}
我可以将可执行文件中的库链接为:
g++ -obuild/main main.cpp -Idependencies/mylib/include/ -Ldependencies/mylib/lib/x64/ -lmylib
在这一点上,运行main.exe
会很好地输出:
Main working.
-0.524002