安装jsonski时node-gyp build失败,寻求解决方案
安装JSONSki时node-gyp build失败的问题排查与解决建议
问题现象
执行node-gyp configure可正常完成:
ubuntu@Ubuntu-22:~/JSON/JSONSki$ node-gyp configure gyp info it worked if it ends with ok gyp info using node-gyp@9.3.1 gyp info using node@14.21.3 | linux | x64 gyp info find Python using Python version 3.10.6 found at "/usr/bin/python3" gyp info spawn /usr/bin/python3 gyp info spawn args [ gyp info spawn args '/home/ubuntu/.nvm/versions/node/v14.21.3/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/ubuntu/JSON/JSONSki/build/config.gypi', gyp info spawn args '-I', gyp info spawn args '/home/ubuntu/.nvm/versions/node/v14.21.3/lib/node_modules/node-gyp/addon.gypi', gyp info spawn args '-I', gyp info spawn args '/home/ubuntu/.cache/node-gyp/14.21.3/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/ubuntu/.cache/node-gyp/14.21.3', gyp info spawn args '-Dnode_gyp_dir=/home/ubuntu/.nvm/versions/node/v14.21.3/lib/node_modules/node-gyp', gyp info spawn args '-Dnode_lib_file=/home/ubuntu/.cache/node-gyp/14.21.3/<(target_arch)/node.lib', gyp info spawn args '-Dmodule_root_dir=/home/ubuntu/JSON/JSONSki', 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 ok
但执行node-gyp build时失败,错误信息如下:
ubuntu@Ubuntu-22:~/JSON/JSONSki$ node-gyp build gyp info it worked if it ends with ok gyp info using node-gyp@9.3.1 gyp info using node@14.21.3 | linux | x64 gyp info spawn make gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] make: Entering directory '/home/ubuntu/JSON/JSONSki/build' make: *** No rule to make target 'Release/obj.target/binding//home/ubuntu/JSON/JSONSki/src/JSONPathParser.o', needed by 'Release/obj.target/binding.node'. Stop. make: Leaving directory '/home/ubuntu/JSON/JSONSki/build' gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/home/ubuntu/.nvm/versions/node/v14.21.3/lib/node_modules/node-gyp/lib/build.js:203:23) gyp ERR! stack at ChildProcess.emit (events.js:400:28) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:285:12) gyp ERR! System Linux 5.19.0-35-generic gyp ERR! command "/home/ubuntu/.nvm/versions/node/v14.21.3/bin/node" "/home/ubuntu/.nvm/versions/node/v14.21.3/bin/node-gyp" "build" gyp ERR! cwd /home/ubuntu/JSON/JSONSki gyp ERR! node -v v14.21.3 gyp ERR! node-gyp -v v9.3.1 gyp ERR! not ok
相关配置文件
binding.gyp
{ 'targets': [ { "target_name": "binding", "sources": [ '/home/ubuntu/JSON/JSONSki/src/JSONPathParser.cpp', '/home/ubuntu/JSON/JSONSki/src/JSONPathParser.h' '/home/ubuntu/JSON/JSONSki/src/QueryAutomaton.h' '/home/ubuntu/JSON/JSONSki/src/QueryProcessor.cpp' '/home/ubuntu/JSON/JSONSki/src/QueryProcessor.h' '/home/ubuntu/JSON/JSONSki/src/RecordLoader.cpp' '/home/ubuntu/JSON/JSONSki/src/RecordLoader.h' '/home/ubuntu/JSON/JSONSki/src/Records.h'] } ], 'include_dirs': ["<!(node -p \"require('node-addon-api').include_dir\")"], 'defines': [ 'NODE_ADDON_API_ENABLE_MAYBE' ], }
package.json
{ "name": "ubuntu", "version": "1.0.0", "description": "", "main": "index.js", "dependencies": { "cmake-js": "^7.2.1", "node-addon-api": "^6.0.0", "node-gyp": "^9.3.1", "nopt": "^7.0.0" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "install": "node-gyp rebuild" }, "keywords": [], "author": "", "license": "ISC", "gypfile": true }
已尝试的无效操作
- 通过nvm安装并测试了Node.js 14至19的所有版本
- 尝试过社区常见的node-gyp构建失败解决方案(包括依赖安装、环境变量配置等)
系统环境
- Python 3.10.6
- gcc 11.3.2
- Ubuntu 22.04(Linux 5.19.0-35-generic)
解决建议
1. 修复binding.gyp的语法错误
核心问题是binding.gyp中sources数组的元素之间缺少逗号分隔,导致GYP解析时把多个文件路径拼接成了一个错误的路径(比如/home/ubuntu/JSON/JSONSki/src/JSONPathParser.h/home/ubuntu/JSON/JSONSki/src/QueryAutomaton.h),最终make找不到对应的目标文件。
修改后的binding.gyp:
{ 'targets': [ { "target_name": "binding", "sources": [ '/home/ubuntu/JSON/JSONSki/src/JSONPathParser.cpp', '/home/ubuntu/JSON/JSONSki/src/JSONPathParser.h', '/home/ubuntu/JSON/JSONSki/src/QueryAutomaton.h', '/home/ubuntu/JSON/JSONSki/src/QueryProcessor.cpp', '/home/ubuntu/JSON/JSONSki/src/QueryProcessor.h', '/home/ubuntu/JSON/JSONSki/src/RecordLoader.cpp', '/home/ubuntu/JSON/JSONSki/src/RecordLoader.h', '/home/ubuntu/JSON/JSONSki/src/Records.h' ] } ], 'include_dirs': ["<!(node -p \"require('node-addon-api').include_dir\")"], 'defines': [ 'NODE_ADDON_API_ENABLE_MAYBE' ], }
2. 优化sources配置(可选)
通常node-gyp的sources只需要包含编译所需的.cpp/.c源文件,头文件会通过代码中的#include自动被编译器识别,无需手动加入sources数组。可以简化配置:
"sources": [ '/home/ubuntu/JSON/JSONSki/src/JSONPathParser.cpp', '/home/ubuntu/JSON/JSONSki/src/QueryProcessor.cpp', '/home/ubuntu/JSON/JSONSki/src/RecordLoader.cpp' ]
3. 清理旧构建文件后重新编译
执行以下命令彻底清理旧构建产物,再重新编译:
rm -rf build/ node-gyp clean node-gyp configure build
内容的提问来源于stack exchange,提问作者Alan Zink
相关产品推荐
相关产品推荐

