Làm cách nào tôi có thể sử dụng thư viện C ++ từ node.js?
Làm cách nào tôi có thể sử dụng thư viện C ++ từ node.js?
Câu trả lời:
Nhìn vào nút-ffi .
node-ffi là một addon Node.js để tải và gọi các thư viện động bằng JavaScript thuần. Nó có thể được sử dụng để tạo các liên kết đến các thư viện riêng mà không cần viết bất kỳ mã C ++ nào.
Có một câu trả lời mới cho câu hỏi đó ngay bây giờ. SWIG , kể từ phiên bản 3.0 dường như cung cấp các trình tạo giao diện javascript cho Node.js, Webkit và v8.
Tôi đã sử dụng SWIG rộng rãi cho Java và Python trong một thời gian và khi bạn hiểu cách SWIG hoạt động, hầu như không có nỗ lực nào (so với ffi hoặc tương đương trong ngôn ngữ đích) cần thiết để giao tiếp mã C ++ với các ngôn ngữ mà SWIG hỗ trợ.
Ví dụ nhỏ, giả sử bạn có một thư viện với tiêu đề mygroup.h:
#include<iostream>
class MyClass {
int myNumber;
public:
MyClass(int number): myNumber(number){}
void sayHello() {
std::cout << "Hello, my number is:"
<< myNumber <<std::endl;
}
};
Để sử dụng lớp này trong nút, bạn chỉ cần viết tệp giao diện SWIG sau (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Tạo tập tin ràng buộc bind.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Chạy các lệnh sau:
swig -c++ -javascript -node mylib.i
node-gyp build
Bây giờ, chạy nút từ cùng một thư mục, bạn có thể làm:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Mặc dù chúng tôi cần phải viết 2 tệp giao diện cho một ví dụ nhỏ như vậy, lưu ý cách chúng tôi không phải đề cập đến hàm MyClass
tạo cũng như sayHello
phương thức ở bất cứ đâu, SWIG phát hiện ra những điều này và tự động tạo giao diện tự nhiên.
std::vector<>
chẳng hạn %include "std_vector.i"
), và bạn sẽ có thể điều khiển nó ở phía javascript theo cách hơi khó xử. Lưu ý rằng phương pháp này vẫn dễ dàng và an toàn hơn nhiều so với việc tự viết FFI.
Bạn có thể sử dụng tiện ích mở rộng node.js để cung cấp các liên kết cho mã C ++ của mình. Đây là một hướng dẫn bao gồm:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Bạn có thể sử dụng emscripten để biên dịch mã C ++ thành js.
Đây là một bài viết thú vị về việc đưa C ++ của bạn lên web với Node.js
ba cách chung để tích hợp mã C ++ với ứng dụng Node.js - mặc dù có rất nhiều biến thể trong mỗi loại:
- Tự động hóa - gọi C ++ của bạn dưới dạng một ứng dụng độc lập trong một quy trình con.
- Thư viện dùng chung - đóng gói các thường trình C ++ của bạn trong thư viện dùng chung (dll) và gọi trực tiếp các thường trình đó từ Node.js.
- Addon Node.js - biên dịch mã C ++ của bạn dưới dạng mô đun / addon Node.js riêng.
Trở nên tuyệt vời với swig và C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
Không nên chạy SWIG trên các tệp nguồn C ++ (những gì sẽ xuất hiện trong tệp .C hoặc .cxx). Mặc dù SWIG có thể phân tích các khai báo lớp C ++, nhưng nó bỏ qua các khai báo được tách rời khỏi định nghĩa lớp gốc của chúng (các khai báo được phân tích cú pháp, nhưng rất nhiều thông báo cảnh báo có thể được tạo ra). Ví dụ:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Rất hiếm khi có lớp C ++ chỉ giới hạn ở một tệp .h.
Ngoài ra, các phiên bản swig hỗ trợ JavaScript là swig-3.0.1 trở lên.
foo::bar
anyway. Định nghĩa của một thành viên lớp là tất cả về thực hiện; các hàm bao mà SWIG tạo ra là tất cả về giao diện.
extension
. Tiện ích mở rộng