Как использовать статическую библиотеку с node-gyp в Windows? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь связать статическую библиотеку, используя 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
...