用node-gyp手動編譯node的c++擴展模塊

又踩坑了,配置永遠比單純的寫代碼要更花費時間。也更令人挫敗。簡單記一筆吧。

最近在弄的一個視頻拼接的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的結合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章