К сожалению, текущий выпуск swig
(3.0.12) не поддерживает Node.js версии 7 или новее.Вместо этого вы получаете ошибки времени компиляции, такие как error: no template named 'WeakCallbackData' in namespace 'v8'
Чтобы использовать swig
с Узлом 8, либо используйте основную ветвь, более позднюю версию swig
(похоже, это будет исправлено вследующий выпуск, который, вероятно, будет 3.0.13), или загрузите 4 файла, измененные в PR 968 , и установите их вместо тех, которые поставлялись с swig 3.0.12
.На моем Mac эти файлы находятся в /usr/local/Cellar/swig/3.0.12/share/swig/3.0.12/javascript/v8/
После этого, тем не менее, @frans еще есть над чем поработать.
Согласно документации SWIG , "крайне важно скомпилировать ваш модуль, используя те же флаги компилятора, которые использовались для сборки v8 ", для чего они рекомендуют собирать ваш модуль с node-gyp
.
. Вам необходимо создать binding.gyp
, например:
{
"targets": [
{
"target_name": "api",
"sources": [ "api.cpp", "api_wrap.cxx" ]
}
]
}
, а затем, после создания оболочки с swig
, соберите модуль с
node-gyp configure build
(При необходимости установите node-gyp
с npm install -g node-gyp
)
Вы, вероятно, также не хотите %module(directors="1")
для JavaScript, и вы не должны использовать стиль скобок include <file.h>
для своих собственных заголовочных файлов.
Кроме того, если вы хотите использовать std::string
, вам необходимо включить std_string.i
в файл интерфейса.
Я полагаю, ваш api.i
будет лучше как
%module api
%{
#include "api.h"
%}
%include "std_string.i"
%include "api.h"
Наконец, когда вы закончите, модуль будет в ./build/Release
, так что тестируйте с
node -e "api = require('./build/Release/api.node'); console.log(api.foo());"