ฉันจะใช้ไลบรารี C ++ จาก node.js ได้อย่างไร
ฉันจะใช้ไลบรารี C ++ จาก node.js ได้อย่างไร
คำตอบ:
ดูโหนด FFI
node-ffi เป็นส่วนเสริม Node.js สำหรับการโหลดและเรียกไลบรารีไดนามิกโดยใช้ JavaScript บริสุทธิ์ สามารถใช้เพื่อสร้างการเชื่อมโยงกับไลบรารีดั้งเดิมโดยไม่ต้องเขียนโค้ด C ++ ใด ๆ
ตอนนี้มีคำตอบใหม่สำหรับคำถามนั้นแล้ว SWIGในเวอร์ชัน 3.0 ดูเหมือนว่าจะมีตัวสร้างอินเทอร์เฟซ javascriptสำหรับ Node.js, Webkit และ v8
ฉันใช้ SWIG อย่างกว้างขวางสำหรับ Java และ Python มาระยะหนึ่งแล้วและเมื่อคุณเข้าใจว่า SWIG ทำงานอย่างไรแทบจะไม่มีความพยายามใด ๆ (เมื่อเทียบกับ ffi หรือเทียบเท่าในภาษาเป้าหมาย) ที่จำเป็นสำหรับการเชื่อมต่อโค้ด C ++ กับภาษาที่ SWIG สนับสนุน
ตัวอย่างเล็ก ๆ เช่นคุณมีห้องสมุดที่มีส่วนหัว 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;
}
};
ในการใช้คลาสนี้ในโหนดคุณเพียงแค่เขียนไฟล์อินเตอร์เฟส SWIG ต่อไปนี้ (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
สร้างไฟล์ที่มีผลผูกพัน binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
รันคำสั่งต่อไปนี้:
swig -c++ -javascript -node mylib.i
node-gyp build
ตอนนี้เรียกใช้โหนดจากโฟลเดอร์เดียวกันคุณสามารถทำได้:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
แม้ว่าเราจะต้องเขียนไฟล์อินเทอร์เฟซ 2 ไฟล์สำหรับตัวอย่างเล็ก ๆ เช่นนี้โปรดสังเกตว่าเราไม่ต้องพูดถึงตัวMyClass
สร้างหรือsayHello
วิธีการใดก็ตาม SWIG ค้นพบสิ่งเหล่านี้และสร้างอินเตอร์เฟสที่เป็นธรรมชาติโดยอัตโนมัติ
std::vector<>
เช่น just %include "std_vector.i"
) และคุณจะสามารถจัดการกับด้านจาวาสคริปต์ในลักษณะที่ค่อนข้างอึดอัด โปรดทราบว่าแนวทางนี้ยังง่ายกว่าและปลอดภัยกว่าการเขียน FFI ด้วยตัวเอง
คุณสามารถใช้ส่วนขยาย node.js เพื่อจัดเตรียมการเชื่อมโยงสำหรับโค้ด C ++ ของคุณ นี่คือบทช่วยสอนหนึ่งรายการที่ครอบคลุม:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
คุณสามารถใช้emscriptenเพื่อรวบรวมรหัส C ++ เป็น js
นี่คือบทความที่น่าสนใจเกี่ยวกับการนำ C ++ ของคุณเข้าสู่เว็บด้วย Node.js
สามวิธีทั่วไปในการรวมโค้ด C ++ กับแอปพลิเคชัน Node.js แม้ว่าจะมีรูปแบบต่างๆมากมายในแต่ละหมวดหมู่:
- ระบบอัตโนมัติ - เรียก C ++ ของคุณเป็นแอปแบบสแตนด์อโลนในกระบวนการย่อย
- ไลบรารีที่ใช้ร่วมกัน - แพ็ครูทีน C ++ ของคุณในไลบรารีที่ใช้ร่วมกัน (dll) และเรียกรูทีนเหล่านั้นจาก Node.js โดยตรง
- Node.js Addon - คอมไพล์โค้ด C ++ ของคุณเป็นโมดูล Node.js ดั้งเดิม / addon
เป็นประโยชน์กับ swig และ C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
ไม่แนะนำให้ใช้ SWIG บนซอร์สไฟล์ C ++ (สิ่งที่จะปรากฏในไฟล์. C หรือ. cxx) แม้ว่า SWIG จะสามารถแยกวิเคราะห์การประกาศคลาส C ++ ได้ แต่จะไม่สนใจการประกาศที่แยกออกจากนิยามคลาสดั้งเดิม (การประกาศจะถูกแยกวิเคราะห์ แต่อาจมีการสร้างข้อความเตือนจำนวนมาก) ตัวอย่างเช่น:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
ไม่ค่อยมีคลาส C ++ จำกัด ไว้ที่ไฟล์. h เพียงไฟล์เดียว
นอกจากนี้เวอร์ชันของ swig ที่รองรับ JavaScript คือ swig-3.0.1 หรือใหม่กว่า
foo::bar
ต่อไป คำจำกัดความของสมาชิกชั้นเรียนเป็นข้อมูลเกี่ยวกับการนำไปใช้งาน Wrapper ที่ SWIG สร้างขึ้นล้วนเกี่ยวกับอินเทอร์เฟซ
extension
. ส่วนขยาย