1. 程式人生 > >用node-gyp手動編譯node的c++擴充套件模組

用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的結合。