如何在Windows 7平台上使用node-gyp?

15

在Windows 7 + Node.js平台上尝试使用node-gyp编译标准的“Hello World”示例[2]时失败了[3]。请注意:当尝试npm install contextify w或w/o "-g"时,node-gyp也以类似的方式失败[3],因此可能存在相关问题。

配置:

  • node-gyp 0.12.2
  • Windows 7 x64 SP1
  • Python 2.7
  • Node.js 0.10.24
  • Visual Studio 2010 per [1](也尝试了2012)
  • VS SDK 7.1 per [1](尝试了32位和64位版本)
  • 从标准Windows命令提示符或SDK 7.1 cmd提示运行node-gyp

参考资料:
[1] https://github.com/TooTallNate/node-gyp/wiki/Visual-Studio-2010-Setup

[2] https://github.com/joyent/node/tree/master/test/addons/hello-world

[3] 在“hello world”[2]项目上执行“node-gyp rebuild”会产生以下2个错误:

....node-gyp\0.10.24\deps\uv\include\win.h(8738): error C2371: 'SYSTEM_POWER_STATUS' : redefinition; different basic types [...\build\test.vcxproj]

....node-gyp\0.10.24\deps\uv\include\mswsock.h(27): fatal error C 1083: Cannot open include file: '_mingw.h': No such file or directory [...\build\test.vcxproj]

和以下2个警告:

....node-gyp\0.10.24\deps\uv\include\win.h(13513): warning C4005: 'UNALIGNED' : macro redefinition [...\build\test.vcxproj]

....node-gyp\0.10.24\deps\uv\include\mswsock.h(26): warning C4068 : unknown pragma [...\build\test.vcxproj]

完整的跟踪如下:

C:\sigma\node_modules\x>node-gyp rebuild
gyp info it worked if it ends with ok
gyp info using node-gyp@0.12.2
gyp info using node@0.10.24 | win32 | x64
gyp info spawn python
gyp info spawn args [ 'C:\\Users\\Anybody\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'msvs',
gyp info spawn args   '-G',
gyp info spawn args   'msvs_version=auto',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\sigma\\node_modules\\x\\build\\config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\Anybody\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\\Users\\Anybody\\.node-gyp\\0.10.24\\common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=C:\\Users\\Anybody\\.node-gyp\\0.10.24',
gyp info spawn args   '-Dmodule_root_dir=C:\\sigma\\node_modules\\x',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--generator-output',
gyp info spawn args   'C:\\sigma\\node_modules\\x\\build',
gyp info spawn args   '-Goutput_dir=.' ]
gyp info spawn msbuild
gyp info spawn args [ 'build/binding.sln',
gyp info spawn args   '/clp:Verbosity=minimal',
gyp info spawn args   '/nologo',
gyp info spawn args   '/p:Configuration=Release;Platform=x64' ]
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.  test.cpp
C:\Users\Anybody\.node-gyp\0.10.24\deps\uv\include\win.h(8738): error C2371: 'SYSTEM_POWER_STATUS' : redefinition; different basic types [C:\sigma\node_modules\x\build\test.vcxproj]  C:\Users\Anybody\.node-gyp\0.10.24\deps\uv\include\win.h(8737) : see declaration of 'SYSTEM_POWER_STATUS'

C:\Users\Anybody\.node-gyp\0.10.24\deps\uv\include\win.h(13513): warning C4005: 'UNALIGNED' : macro redefinition [C:\sigma\node_modules\x\build\test.vcxproj] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdef s.h(502) : see previous definition of 'UNALIGNED'

C:\Users\Anybody\.node-gyp\0.10.24\deps\uv\include\mswsock.h(26): warning C4068 : unknown pragma [C:\sigma\node_modules\x\build\test.vcxproj] C:\Users\Anybody\.node-gyp\0.10.24\deps\uv\include\_mingw.h(33): warning C4068: unknown pragma [C:\sigma\node_modules\x\build\test.vcxproj]

C:\Users\Anybody\.node-gyp\0.10.24\deps\uv\include\_mingw.h(51): fatal error C1 189: #error :  ERROR: You must use a GNU Compiler. [C:\sigma\node_modules\x\build\test.vcxproj]

gyp ERR! build error
gyp ERR! stack Error: msbuild failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (C:\Users\Anybody\AppData\Roaming\npm\
node_modules\node-gyp\lib\build.js:267:23)
gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:789:12)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "node" "C:\\Users\\Anybody\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\sigma\node_modules\x
gyp ERR! node -v v0.10.24
gyp ERR! node-gyp -v v0.12.2
gyp ERR! not ok   

我也遇到了同样的问题~ 我按照 Refs[1] 中的所有步骤操作,你解决了吗?如果解决了,请分享一下。 - Imran Bughio
请在此问题中添加您的用户体验:https://github.com/TooTallNate/node-gyp/issues/662 如果更多人加入,他们可能会添加一个适当的安装程序。 - inf3rno
3个回答

9

虽然这个问题已经一个月之前了,但我还是在网上搜索了一番,结果找到了这个答案。

所以,在此提供一个不应该使用但却可以运作的答案。

首先,我不熟悉node-gyp或整个Visual Studio编译等方面的知识,我真的很抱歉node-gyp依赖Python(一种非常默默无闻的WTF)。

因此,对于某些原因,早于0.10.22版本的nodejs(我现在正在运行这个版本,所以我认为从这里开始)

如果您在系统中搜索“uv.h”文件,您可能会得到一些结果,但前提是您之前已经安装过nodejs版本,否则您可以继续阅读。

我的先前的0.10.3 nodejs版本中包含了类似下面这样的uv.h文件

<DRIVERLETTER>:\Users\<USERNAME>\.node-gyp\0.10.3\deps\uv

如果你阅读npm文档,你会发现在npm install命令中的参数。

使用--nodedir=/path/to/node/source参数可以让npm找到node源代码,以便npm可以编译本地模块。

因此,最终的命令应该是:

npm install <package> --nodedir="<DRIVERLETTER>:\Users\<USERNAME\.node-gyp\0.10.3"

你可能会收到一些警告,但它应该成功完成。


我没有0.10.3版本,但我在0.10.21版本中找到了uv.h文件 - 正在尝试安装 jsdom 模块 - 仍然出现相同的错误。 - Imran Bughio
20
+1 WTF。在Windows7上使用Node-gyp是最大的耻辱,这给Node的可用性带来了巨大的阴影。 - setec
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Sithu
2
必须同意@setec的观点。此外,Windows很糟糕。 - blong
这可能对任何试图解决此问题的人有所帮助:https://www.robertkehoe.com/2015/03/fix-node-gyp-rebuild-error-on-windows/ - blong
现在也可以不使用VS运行,因为他们再次在Win SDK中提供独立的Windows C编译器。而且拥有Python依赖并不可耻。这些家伙多年来一直涉及Windows的花哨操作。 - Erik Reppen

1
在进行任何操作之前,请从Node网站安装更新Node和NPM(通过npm更新node和npm似乎在Windows上无法正常工作。我不确定那些按顺序删除并重新安装所有内容的说明是否仍然适用,但那肯定是一个巨大的痛点,这也激发了我寻找替代方案,因为那篇文章在Node年份上有点过时)。
最终,这解决了我使用pg模块的依赖项node-gyp的问题,并且它似乎在vs 2013上运行(或者至少在开始工作之前它看起来是这样)。

我在多台机器上苦苦挣扎了数天,最终安装VS2013才解决了这个问题。 - Alex C

0

这是帮助我解决问题的方法:

由于某种原因,我在两个不同的目录中都有node-gyp。

目录1:

C:\Users\Imran Bughio\.node-gyp\0.10.21\

目录 2:

C:\Users\Imran Bughio\Documents\.node-gyp\0.10.21\


在第二个目录中,我有一个deps文件夹内的uv文件夹,但是在第一个目录中没有这个文件夹。

这是路径--请注意它里面有uv.h文件。

C:\Users\Imran Bughio\.node-gyp\0.10.21\deps\uv

解决方案:

我只是将uv和其他额外的文件夹从目录2移动到目录1。

@Phoenix的答案给了我一点提示,最终帮助我解决了这个问题,感谢Phoenix。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接