[英]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
不能解析外部符號?
附加信息:
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.