Я разрабатываю надстройку nodejs, используя node-addon-api и node-gyp 9.3.1. Однако, когда я пытаюсь импортировать с помощью require, я получаю следующую ошибку:
Uncaught Error: The specified module could not be found.
\\?\C:\Users\simon\Documents\draw2d\build\Release\canvas_sdl2.node
at Module._extensions..node (node:internal/modules/cjs/loader:1353:18)
at Module.load (node:internal/modules/cjs/loader:1125:32)
at Module._load (node:internal/modules/cjs/loader:965:12)
at Module.require (node:internal/modules/cjs/loader:1149:19)
at require (node:internal/modules/helpers:121:18) {
code: 'ERR_DLOPEN_FAILED'
Я использую NodeJS v20.0.0, но пробовал и более старые версии, например v18.16.0. Аддон следующий:
#include <napi.h>
#include <SDL.h>
#include <string>
Napi::Value sdl_init_n(const Napi::CallbackInfo& info)
{
Napi::Env env = info.Env();
Uint32 flags = info[0].As<Napi::Number>().Uint32Value();
return Napi::Number::New(env, SDL_Init(flags));
}
Napi::Object Init(Napi::Env env, Napi::Object exports)
{
exports.Set(Napi::String::New(env, "init"), Napi::Function::New<sdl_init_n>(env));
//exports.Set(Napi::String::New(env, "createWindow"), Napi::Function::New<sdl_create_window>(env));
return exports;
}
NODE_API_MODULE(addon, Init);
Я попытался изменить NODE_API_MODULE(addon, Init) на NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init) в файле cpp.
Я также пытался изменить требование удаления расширения .node.
Обновлено: Это файл binding.gyp
{
'targets': [
{
'target_name': 'canvas_sdl2',
'sources': ['src\\sdl2node.cpp'],
'include_dirs': [
"C:\\SDL\\SDL2-2.26.5\\include",
"C:\\SDL_Image\\SDL2_image-2.6.3\\include",
"<!@(node -p \"require('node-addon-api').include\")"
],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")"
],
'libraries': [
"C:\\SDL\\SDL2-2.26.5\\lib\\x64\\SDL2.lib",
"C:\\SDL_Image\\SDL2_image-2.6.3\\lib\\x64\\SDL2_image.lib"
],
'cflags!': ['-fno-exceptions'],
'cflags_cc!': ['-fno-exceptions'],
'xcode_settings': {
'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
'CLANG_CXX_LIBRARY': 'libc++',
'MACOSX_DEPLOYMENT_TARGET': '10.7'
},
'msvs_settings': {
'VCCLCompilerTool': {'ExceptionHandling': 1},
}
}
]
}
Открыв файл .node с помощью обходчика зависимостей, он просто дает мне символ, который является napi_register_module_v1, и некоторую ошибку с API-MS-WIN-CORE. В файле binding.gyp я уже указал путь к SDL2.lib, на самом деле я не получаю никакой ошибки в процессе сборки.
Удаление всех следов SDL, тогда это работает, но я не знаю, почему





Я исправил проблему с копированием файла SDl2.dll в папку build\Release\ с помощью binding.gyp:
{
'targets': [
{
'target_name': 'canvas_sdl2',
'sources': ['src\\sdl2node.cpp'],
'cflags!': ['-fno-exceptions'],
'cflags_cc!': ['-fno-exceptions'],
'xcode_settings': {
'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
'CLANG_CXX_LIBRARY': 'libc++',
'MACOSX_DEPLOYMENT_TARGET': '10.7'
},
'msvs_settings': {
'VCCLCompilerTool': {'ExceptionHandling': 1},
},
'conditions': [
["OS==\"win\"", {
'include_dirs': [
"C:\\SDL\\SDL2-2.26.5\\include",
"C:\\SDL_Image\\SDL2_image-2.6.3\\include",
"<!@(node -p \"require('node-addon-api').include\")"
],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")"
],
'libraries': [
"C:\\SDL\\SDL2-2.26.5\\lib\\x64\\SDL2.lib",
"C:\\SDL_Image\\SDL2_image-2.6.3\\lib\\x64\\SDL2_image.lib"
],
'copies': [
# Here i copy the SDL2.dll file
{
'destination': '<(module_root_dir)/build/Release/',
'files': [
'C:\\SDL\\SDL2-2.26.5\\lib\\x64\\SDL2.dll'
]
}
]
}]
]
}
]
}
Используйте такой инструмент, как обходчик зависимостей, чтобы изучить сгенерированную библиотеку. Мой хрустальный шар говорит, что у него отсутствует зависимость от libsdl2.dll.