Я пытаюсь связать статическую библиотеку, используя 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
)) Я получаю другую ошибку о том, что входной файл не может быть открыт.Тем не менее, не может разрешить внешний символ .
Я нашел похожий вопрос без ответа здесь .Ответы на другие вопросы указывают на добавление полного пути к библиотеке к libraries
, но я не думаю, что это проблема для моего сценария.
Почему node-gyp
не может разрешить внешний символ?
Дополнительная информация:
- Я использую Windows 10
- Я проверил, что библиотека работает, пытаясь использовать ее с
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