Bagaimana saya bisa menggunakan pustaka C ++ dari node.js?
Bagaimana saya bisa menggunakan pustaka C ++ dari node.js?
Jawaban:
Lihatlah node-ffi .
node-ffi adalah addon Node.js untuk memuat dan memanggil pustaka dinamis menggunakan JavaScript murni. Ini dapat digunakan untuk membuat binding ke pustaka asli tanpa menulis kode C ++.
Ada jawaban baru untuk pertanyaan itu sekarang. SWIG , pada versi 3.0 tampaknya menyediakan generator antarmuka javascript untuk Node.js, Webkit, dan v8.
Saya telah menggunakan SWIG secara ekstensif untuk Java dan Python untuk sementara waktu, dan begitu Anda memahami cara kerja SWIG, hampir tidak ada upaya (dibandingkan dengan ffi atau yang setara dalam bahasa target) yang diperlukan untuk menghubungkan kode C ++ ke bahasa yang SWIG mendukung.
Sebagai contoh kecil, misalkan Anda memiliki perpustakaan dengan header myclass.h:
#include<iostream>
class MyClass {
int myNumber;
public:
MyClass(int number): myNumber(number){}
void sayHello() {
std::cout << "Hello, my number is:"
<< myNumber <<std::endl;
}
};
Untuk menggunakan kelas ini dalam simpul, Anda cukup menulis file antarmuka SWIG berikut (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Buat file mengikat binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Jalankan perintah berikut:
swig -c++ -javascript -node mylib.i
node-gyp build
Sekarang, menjalankan simpul dari folder yang sama, dapat Anda lakukan:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Meskipun kami perlu menulis 2 file antarmuka untuk contoh sekecil itu, perhatikan bagaimana kami tidak perlu menyebutkan MyClass
konstruktor atau sayHello
metode di mana pun, SWIG menemukan hal-hal ini, dan secara otomatis menghasilkan antarmuka alami.
std::vector<>
misalnya, hanya %include "std_vector.i"
), dan Anda akan dapat memanipulasinya di sisi javascript dengan cara yang agak canggung. Perhatikan bahwa pendekatan ini masih jauh lebih mudah dan lebih aman daripada menulis sendiri FFI.
Anda dapat menggunakan ekstensi node.js untuk memberikan binding untuk kode C ++ Anda. Berikut adalah satu tutorial yang mencakup hal itu:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Anda bisa menggunakan emscripten untuk mengkompilasi kode C ++ menjadi js.
Berikut ini adalah artikel menarik tentang Mendapatkan C ++ ke Web dengan Node.js
tiga cara umum mengintegrasikan kode C ++ dengan aplikasi Node.js - walaupun ada banyak variasi dalam setiap kategori:
- Otomasi - panggil C ++ Anda sebagai aplikasi mandiri dalam proses anak.
- Pustaka bersama - kemas C ++ rutin Anda di pustaka bersama (dll) dan panggil rutin tersebut dari Node.js secara langsung.
- Addon Node.js - kompilasi kode C ++ Anda sebagai modul / addon Node.js asli.
Berhati-hatilah dengan swig dan C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
Menjalankan SWIG pada file sumber C ++ (apa yang akan muncul dalam file .C atau .cxx) tidak disarankan. Meskipun SWIG dapat menguraikan deklarasi kelas C ++, ia mengabaikan deklarasi yang dipisahkan dari definisi kelas aslinya (deklarasi tersebut diuraikan, tetapi banyak pesan peringatan dapat dihasilkan). Sebagai contoh:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Jarang memiliki kelas C ++ terbatas hanya pada satu file .h.
Juga, versi swig yang mendukung JavaScript adalah swig-3.0.1 atau yang lebih baru.
foo::bar
itu. Definisi anggota kelas adalah tentang implementasi; pembungkus yang dihasilkan SWIG adalah semua tentang antarmuka.
extension
. Ekstensi