Ubuntu 22.04下SWIG生成V8/Node.js模块报错:Module did not self-register
问题:SWIG生成Node.js模块运行报错「Module did not self-register」及node-gyp编译失败
环境信息
- Ubuntu 22.04
- SWIG Version 4.3.0
- Node.js v20.14.0
- V8 11.3.244.8-node.23
手动编译流程与运行报错
手动编译步骤及输出如下:
==== run Nodejs example SWIG Version 4.3.0 node v20.14.0 v8 11.3.244.8-node.23 ==== swig swig -c++ -javascript -v8 -Isrc -o debug/node_example_wrap.cxx src/example.i ==== gcc 1 c++ -std=c++20 -c src/example.c -o debug/node_example.o ==== gcc 2 c++ -c -fPIC -I /usr/include/node -I /usr/local/share/swig/4.3.0 debug/node_example_wrap.cxx -o debug/node_example_wrap.o ==== c++ shared c++ -std=c++20 debug/node_example.o debug/node_example_wrap.o -o debug/node_example.so ==== copy it total 76 drwxrwxr-x 2 me me 4096 Oct 30 12:34 . drwxrwxr-x 8 me me 4096 Oct 30 12:34 .. -rwxrwxr-x 1 me me 65592 Oct 30 12:34 example.node
运行生成的模块时出现报错:
node:internal/modules/cjs/loader:1454 return process.dlopen(module, path.toNamespacedPath(filename)); ^ Error: Module did not self-register: '/home/me/projects/web/cpp/swig-c/out/js/example.node'. at Module._extensions..node (node:internal/modules/cjs/loader:1454:18) at Module.load (node:internal/modules/cjs/loader:1208:32) at Module._load (node:internal/modules/cjs/loader:1024:12) at Module.require (node:internal/modules/cjs/loader:1233:19) at require (node:internal/modules/helpers:179:18) at Object.<anonymous> (/home/me/projects/web/cpp/swig-c/test.js:1:17) at Module._compile (node:internal/modules/cjs/loader:1358:14) at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) at Module.load (node:internal/modules/cjs/loader:1208:32) at Module._load (node:internal/modules/cjs/loader:1024:12) { code: 'ERR_DLOPEN_FAILED' } Node.js v20.14.0
node-gyp编译报错
尝试使用node-gyp configure build编译时失败,报错如下:
$ node-gyp configure build gyp info it worked if it ends with ok gyp info using node-gyp@10.2.0 gyp info using node@20.14.0 | linux | x64 gyp info find Python using Python version 3.10.12 found at "/usr/bin/python3" gyp info spawn /usr/bin/python3 gyp info spawn args [ gyp info spawn args '/home/me/.nvm/versions/node/v20.14.0/lib/node_modules/node-gyp/gyp/gyp_main.py', gyp info spawn args 'binding.gyp', gyp info spawn args '-f', gyp info spawn args 'make', gyp info spawn args '-I', gyp info spawn args '/home/me/projects/web/cpp/swig-c/build/config.gypi', gyp info spawn args '-I', gyp info spawn args '/home/me/.nvm/versions/node/v20.14.0/lib/node_modules/node-gyp/addon.gypi', gyp info spawn args '-I', gyp info spawn args '/home/me/.cache/node-gyp/20.14.0/include/node/common.gypi', gyp info spawn args '-Dlibrary=shared_library', gyp info spawn args '-Dvisibility=default', gyp info spawn args '-Dnode_root_dir=/home/me/.cache/node-gyp/20.14.0', gyp info spawn args '-Dnode_gyp_dir=/home/me/.nvm/versions/node/v20.14.0/lib/node_modules/node-gyp', gyp info spawn args '-Dnode_lib_file=/home/me/.cache/node-gyp/20.14.0/<(target_arch)/node.lib', gyp info spawn args '-Dmodule_root_dir=/home/me/projects/web/cpp/swig-c', gyp info spawn args '-Dnode_engine=v8', gyp info spawn args '--depth=.', gyp info spawn args '--no-parallel', gyp info spawn args '--generator-output', gyp info spawn args 'build', gyp info spawn args '-Goutput_dir=.' gyp info spawn args ] gyp info spawn make gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] make: Entering directory '/home/me/projects/web/cpp/swig-c/build' CXX(target) Release/obj.target/debug/node_example.so/debug/node_example_wrap.o ../debug/node_example_wrap.cxx:1933:12: error: expected constructor, destructor, or type conversion before ‘(’ token 1933 | NODE_MODULE(example, example_initialize) | ^ make: *** [debug/node_example.so.target.mk:107: Release/obj.target/debug/node_example.so/debug/node_example_wrap.o] Error 1 make: Leaving directory '/home/me/projects/web/cpp/swig-c/build' gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.<anonymous> (/home/me/.nvm/versions/node/v20.14.0/lib/node_modules/node-gyp/lib/build.js:216:23) gyp ERR! System Linux 5.15.0-124-generic gyp ERR! command "/home/me/.nvm/versions/node/v20.14.0/bin/node" "/home/me/.nvm/versions/node/v20.14.0/bin/node-gyp" "configure" "build" gyp ERR! cwd /home/me/projects/web/cpp/swig-c gyp ERR! node -v v20.14.0 gyp ERR! node-gyp -v v10.2.0 gyp ERR! not ok
已尝试的无效方案
- 参考同类问题的多种解决方案无效
- 使用
-javascript -node参数编译,结果相同 - 尝试
-javascript -jsc参数,陷入头文件与动态库依赖问题无法解决 - 更换SWIG版本(4.0.2、4.2.1、4.3.0)均失败
- 同一
example.i文件在该系统及macOS下的Python、Ruby环境可正常工作
寻求有效的解决方案!
内容的提问来源于stack exchange,提问作者JohnA
相关产品推荐
相关产品推荐

