node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
Chicken-and-egg problem with node-gyp: Pointing to a header file in a dependency
这是我第一次尝试构建包含 C++ 代码的 npm 包。我认为我已经正确设置了所有内容,因为在包本身的项目文件夹中工作时,npm i
或 node-gyp rebuild
工作正常。
但是现在我已经发布了这个包,并且我正在尝试将该包作为另一个项目的依赖项,在编译过程中安装失败,当我试图包含一个重要的 C 头文件时:
CXX(target) Release/obj.target/ar_signal_monitor/ar-signal-monitor-node.o
../ar-signal-monitor-node.cpp:1:10: fatal error: 'napi.h' file not found
#include <napi.h>
^~~~~~~~
1 error generated.
头文件在包的依赖项之一中,node-addon-api
。我的 binding.gyp
文件如下所示:
{
"targets": [
{
"target_name": "ar_signal_monitor",
"cflags!": ["-fno-exceptions"],
"cflags_cc!": ["-fno-exceptions"],
"cflags": ["-Wall", "-std=c++11", "-pthread"],
"cflags_cc": ["-Wall", "-pthread"],
"sources": [
"ar-signal-monitor-node.cpp",
"ar-signal-monitor-node.h",
"ar-signal-monitor.cpp",
"ar-signal-monitor.h"
],
"include_dirs": [
"<!(node -e \"require('node-addon-api').include\")",
"node_modules/node-addon-api",
"/usr/include/node",
"/usr/local/include/node"
],
"libraries": [
"-lwiringPi"
],
"defines": ["NAPI_CPP_EXCEPTIONS"],
'conditions': [
["OS==\"mac\"", {
"defines": ["USE_FAKE_WIRING_PI"],
"libraries!": ["-lwiringPi"],
"xcode_settings": {"GCC_ENABLE_CPP_EXCEPTIONS": "YES"}
}],
["OS==\"win\"", {
"defines": ["USE_FAKE_WIRING_PI"],
"libraries!": ["-lwiringPi"]
}],
],
}
]
}
我正在尝试使用 "include_dirs"
告诉编译器在哪里可以找到 <napi.h>
头文件。我认为也许我遇到的问题是安装过程想要编译我的 C++ 代码 首先 ,只有在成功完成之后才加载我需要的头文件所在的依赖 npm 包编译成功。
有办法解决这个问题吗?这是一个与我想象的不同的问题吗?我首先尝试在客户端项目中包含 node-addon-api
,但这没有帮助。 (即使它奏效了,也不会比临时的口头禅更好。)
项目的完整代码可以在这里找到:https://github.com/kshetline/rpi-acu-rite-temperature
我一直在想我需要在我的 binding.gyp
文件中做一些不同的事情,但是解决方案(或者,至少,a 解决方案)变成了成为我可以在 package.json
:
中做的事情
"scripts": {
"preinstall": "npm i node-addon-api",
这是我第一次尝试构建包含 C++ 代码的 npm 包。我认为我已经正确设置了所有内容,因为在包本身的项目文件夹中工作时,npm i
或 node-gyp rebuild
工作正常。
但是现在我已经发布了这个包,并且我正在尝试将该包作为另一个项目的依赖项,在编译过程中安装失败,当我试图包含一个重要的 C 头文件时:
CXX(target) Release/obj.target/ar_signal_monitor/ar-signal-monitor-node.o
../ar-signal-monitor-node.cpp:1:10: fatal error: 'napi.h' file not found
#include <napi.h>
^~~~~~~~
1 error generated.
头文件在包的依赖项之一中,node-addon-api
。我的 binding.gyp
文件如下所示:
{
"targets": [
{
"target_name": "ar_signal_monitor",
"cflags!": ["-fno-exceptions"],
"cflags_cc!": ["-fno-exceptions"],
"cflags": ["-Wall", "-std=c++11", "-pthread"],
"cflags_cc": ["-Wall", "-pthread"],
"sources": [
"ar-signal-monitor-node.cpp",
"ar-signal-monitor-node.h",
"ar-signal-monitor.cpp",
"ar-signal-monitor.h"
],
"include_dirs": [
"<!(node -e \"require('node-addon-api').include\")",
"node_modules/node-addon-api",
"/usr/include/node",
"/usr/local/include/node"
],
"libraries": [
"-lwiringPi"
],
"defines": ["NAPI_CPP_EXCEPTIONS"],
'conditions': [
["OS==\"mac\"", {
"defines": ["USE_FAKE_WIRING_PI"],
"libraries!": ["-lwiringPi"],
"xcode_settings": {"GCC_ENABLE_CPP_EXCEPTIONS": "YES"}
}],
["OS==\"win\"", {
"defines": ["USE_FAKE_WIRING_PI"],
"libraries!": ["-lwiringPi"]
}],
],
}
]
}
我正在尝试使用 "include_dirs"
告诉编译器在哪里可以找到 <napi.h>
头文件。我认为也许我遇到的问题是安装过程想要编译我的 C++ 代码 首先 ,只有在成功完成之后才加载我需要的头文件所在的依赖 npm 包编译成功。
有办法解决这个问题吗?这是一个与我想象的不同的问题吗?我首先尝试在客户端项目中包含 node-addon-api
,但这没有帮助。 (即使它奏效了,也不会比临时的口头禅更好。)
项目的完整代码可以在这里找到:https://github.com/kshetline/rpi-acu-rite-temperature
我一直在想我需要在我的 binding.gyp
文件中做一些不同的事情,但是解决方案(或者,至少,a 解决方案)变成了成为我可以在 package.json
:
"scripts": {
"preinstall": "npm i node-addon-api",