当前位置: 首页 > 工具软件 > Swig-NodeJS > 使用案例 >

SWIG和nodejs配合使用的一些问题

陶博涉
2023-12-01

写在前面

由于想把opencv的一些东西移植到服务器后端上,因此想使用SWIG进行代码的转换,生成一个nodejs的库,过程中遇到如下困难解决了一个上午。。。特此记录,期望可以帮助到更多的小伙伴。


环境描述

系统:ubuntu 1604
SWIG版本:3.0.12(release 最新)
nodejs版本:10.15.3(最新)
npm版本:6.4.1
v8版本: 6.8+


问题描述

  1. 开始的时候只是使用ubuntu默认的nodejs,版本为4.6.1,SWIG版本为3.0.12,按照网上的教程最后是没有问题的,可以编出一个.node文件且运行良好。
  2. 由于nodejs版本的问题,笔者将nodejs更新到最新版本之后,开始出现SWIG转换出的函数的问题,具体如下:

…/Smooth_wrap.cxx:2006:47: error: ‘WeakCallbackData’ in namespace ‘v8’ does not name a template type
static void _wrap_delete_Line(const v8::WeakCallbackData<v8::Object, SWIGV8_Proxy> &data) {
^
…/Smooth_wrap.cxx:2006:63: error: expected ‘,’ or ‘…’ before ‘<’ token
static void _wrap_delete_Line(const v8::WeakCallbackData<v8::Object, SWIGV8_Proxy> &data) {
^
…/Smooth_wrap.cxx: In function ‘void _wrap_delete_Line(int)’:
…/Smooth_wrap.cxx:2007:40: error: ‘data’ was not declared in this scope
v8::Localv8::Object object = data.GetValue();
^
…/Smooth_wrap.cxx: At global scope:
…/Smooth_wrap.cxx:2984:55: error: ‘WeakCallbackData’ in namespace ‘v8’ does not name a template type
static void _wrap_delete_EdgeSmoother(const v8::WeakCallbackData<v8::Object, SWIGV8_Proxy> &data) {
^
…/Smooth_wrap.cxx:2984:71: error: expected ‘,’ or ‘…’ before ‘<’ token
static void _wrap_delete_EdgeSmoother(const v8::WeakCallbackData<v8::Object, SWIGV8_Proxy> &data) {
^
…/Smooth_wrap.cxx: In function ‘void _wrap_delete_EdgeSmoother(int)’:
…/Smooth_wrap.cxx:2985:40: error: ‘data’ was not declared in this scope
v8::Localv8::Object object = data.GetValue();
^
…/Smooth_wrap.cxx: In function ‘void SWIG_V8_SetModule(void*, swig_module_info*)’:
…/Smooth_wrap.cxx:3265:15: error: ‘class v8::Object’ has no member named ‘SetHiddenValue’
global_obj->SetHiddenValue(SWIGV8_STRING_NEW(“swig_module_info_data”), mod);
^
…/Smooth_wrap.cxx: In function ‘swig_module_info* SWIG_V8_GetModule(void*)’:
…/Smooth_wrap.cxx:3271:49: error: ‘class v8::Object’ has no member named ‘GetHiddenValue’
v8::Localv8::Value moduleinfo = global_obj->GetHiddenValue(SWIGV8_STRING_NEW(“swig_module_info_data”));

  1. 在网上找了很多之后,发现一个16年的一个issue是说SWIG并不支持nodejs 7.0.0+以上版本,纳尼?_?;
  2. 随后又找一些解决方案之后,发现确实,SWIG官方的确实不支持nodejs 7.0.0+以上版本,但是可以打补丁,解决方案如下:
wget https://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-devtools/swig/swig/0001-Add-Node-7.x-aka-V8-5.2-support.patch
cd /usr/share/swig3.0(or /usr/local/share/swig/VERSION)
sudo patch -p2 <~/0001-Add-Node-7.x-aka-V8-5.2-support.patch
 类似资料: