又踩坑了,配置永遠比單純的寫代碼要更花費時間。也更令人挫敗。簡單記一筆吧。
最近在弄的一個視頻拼接的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
的結合。