簡體   English   中英

如何在 Windows 上使用帶有 node-gyp 的靜態庫?

[英]How to use a static library with node-gyp on Windows?

我正在嘗試使用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

在上面的問題中,靜態庫libmylib.a<\/code>是使用mingw64<\/code>安裝中的g++<\/code>編譯的。 但是, node-gyp<\/code>使用 Microsoft C 和 C++ (MSVC) 運行時庫。

看起來(即,在 GitHub 上查看這個問題<\/a>) node-gyp<\/code> gyp 不支持mingw64<\/code> 。 在鏈接的問題中,有人指出

mingw 使用自己的名稱修改方案,這使得互操作性成為不可能。<\/a>

這也是這個問題中遇到的問題(即error LNK2001: unresolved external symbol<\/code> )。 解決方案是使用 Microsoft 工具鏈創建靜態庫,然后鏈接器將正確解析符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM