簡體   English   中英

從Node.js運行C / C ++代碼

[英]Run c/c++ code from nodejs

假設我在c ++或c中有一個簡單的hello world文件(無論如何,它將幫助我在node.js中更輕松地使用它,最好是c),並希望從node.js文件中運行它。 考慮將文件用於提高性能的最有效方法是什么(將CPU密集型功能從node.js更改為c / c ++)。

我遇到了插件,但在我看來,要使用它,我必須轉換很多代碼才能將其轉換為這種格式。 有更容易的方法嗎?

我不明白為什么使用child_process比其他選項要慢,我建議:

// myCFile.c
#include <stdio.h>
int main(void){

    // processor intensive computations
    int x = 1+2+3;

    // send to node via stdout
    printf("%d", x);

    //terminate the process
    return 0;
}

編譯:

$ gcc -o myExecutable myCFile.c

並使用child_process這樣的:

//myNodeFile.js
const { exec } = require("child_process");
exec("./myExecutable", (error, stdout, stderr) => console.log(stdout));

對於我用C++編寫的圖像分割算法,我需要幫助全棧開發人員包裝node.js的共享庫。 據我所知,從Google到處闖入node.js的那一天開始(這對我來說是一個陌生的世界),有兩種主要選擇:

  1. 使用node-ffi ,或者
  2. 您已經說過的addons

對於上述1.,您不需要做很多事情。 您只需要在node.js要求ffirefref-array軟件包/附加程序就能調用您的應用程序代碼的C API。 我遵循了一些不錯的教程 ,它幫助我在15分鍾內開始學習。

但是,最后我需要為我們的項目選擇2。 這是因為我們的全棧開發人員依賴其他一些需要最新版本的node.js插件。 顯然,當我們檢查的問題板node-ffi ,作為這個答案的發帖時間,它支持v9.x家庭node.js 因此,我采用了原生插件方式。 我花了大約4個小時來理解和編寫代碼。 我不確定這是否是最方便/最有效的方法,但是我所做的是

  1. 使用緩沖區node.js分配內存,
  2. 編寫使用一個簡單的附加組件nannode.jsreinterpret_cast S上的char*緩沖node.js並調用共享庫的非常相同的C API,最后,
  3. 鏈接到我們使用binding.gyp創建的共享庫。

顯然,用戶應該使用Node.js的本機抽象(又名nan ),以避免需要處理v8引入的重大更改。 我找到了另一個不錯的教程 ,它可以幫助我輕松解決問題。

最后, 斯科特·弗里斯Scott Frees)的博客網站似乎為那些想深入的人提供了許多獨立的文章/示例。 他還指出,在哪種情況下,您應該首選一種方法而不是另一種方法(例如, node-ffi優於本機插件)。 基本上,我的理解是,即使對於我們的應用程序來說,編寫本機附加組件也沒什么大不了的。 在解決圖像分割問題時, node-ffi行為也令人滿意(總之,它比調用開銷要花費更多的時間)。

簡而言之,

我遇到了插件,但在我看來,要使用它,我必須轉換很多代碼才能將其轉換為這種格式。

好吧,不一定! 這取決於您願意實現的目標。 就像為特定的C-API共享庫編譯C ++代碼,然后在nan編寫一個20層的包裝器一樣簡單,該包裝器實際上對就地內存操作做了一些reinterpret_cast ,最后在binding.gyp與該庫鏈接binding.gyp

有更容易的方法嗎?

就在這里。 node-ffi可以在半小時內幫助您解決問題。 但是,這對於您的方案而言可能不是最有效的,或者對於您而言可能不是一個可行的選擇,因為它當前未使用v9.x系列的node.js構建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM