又踩坑了,配置永远比单纯的写代码要更花费时间。也更令人挫败。简单记一笔吧。
最近在弄的一个视频拼接的npm包,就有C++扩展,npm install 的时候屡屡不成功,后来总算成功了。实际引入的时候又找不到入口。排查了一下就是里面用到了C++扩展,需要重新编译。后来全局装了node-gyp对着报错把包一个个编译了一遍,终于成功了。
以下是一些知识点:
C/C++对比javascript在位运算上具有极大优势,很多转码、编码的功能可以用C/C++扩展来提升性能。
C++模块通过预先编译为.node文件,然后调用process.dlopen() 加载执行。.node文件实际上在不同平台下是不一样的。如图。
*nix | windows C/C++源码 g++/gcc编译成.node文件(.so文件) | VC++编译成.node文件(.dll文件) dlopen加载.node文件导出给javascript
gyp的意思是generate your projects。node-gyp是一个node的扩展构建工具,通过npm install -g node-gyp
安装。写好.gyp项目编译文件后,它会自动按这个文件进行编译。该文件被约定为binding.gyp。一个简单的binding.gyp长这样:
{
"targets": [
{
"target_name": "hello",
"sources": [ "src/hello.cc" ],
"conditions:": [
["OS=='win'",{
"libraries": ["-lnode.lib"]
}]
]
},
]
}
注意经常在手动编译的时候报错binding.gyp not found (cwd: /usr/local/bin)
,那是因为如果这个文件没有被down下来,你是要自己写的。。。可以参见下.cc文件头来写。千万记住要在有binding.gyp的文件夹下执行node-gyp命令!!!
调用node-gyp configure
会在当前目录中穿件Build目录并生成相关的项目文件,最后会报一个 gyp info ok
。然后继续执行 node-gyp build
编译,在linux下通过make,windows下通过vcbuild,编译完成后,.node文件就会出现在
build/Release 目录下。
也可以直接node-gyp rebuild
, 这个命令相当于clean, configure, build
的结合。