node.js에서 C ++ 라이브러리를 어떻게 사용합니까?
node.js에서 C ++ 라이브러리를 어떻게 사용합니까?
답변:
봐 노드 FFI .
node-ffi는 순수 JavaScript를 사용하여 동적 라이브러리를로드하고 호출하기위한 Node.js 애드온입니다. C ++ 코드를 작성하지 않고 기본 라이브러리에 대한 바인딩을 작성하는 데 사용할 수 있습니다.
그 질문에 대한 새로운 해답이 있습니다. SWIG 버전 3.0 현재 Node.js, Webkit 및 v8에 대한 자바 스크립트 인터페이스 생성기 를 제공하는 것으로 보입니다 .
Java 및 Python에 SWIG를 광범위하게 사용하고 있으며 SWIG의 작동 방식을 이해하면 C ++ 코드를 SWIG 언어와 인터페이스하는 데 필요한 노력이 거의 없습니다 (대상 언어의 ffi 또는 이에 상응하는 언어와 비교). 지원합니다.
작은 예로, 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로 컴파일 할 수 있습니다 .
다음은 Node.js를 사용하여 C ++를 웹에 가져 오는 흥미로운 기사입니다.
C ++ 코드를 Node.js 애플리케이션과 통합하는 세 가지 일반적인 방법-각 카테고리마다 많은 변형이 있지만 :
- 자동화-하위 프로세스에서 C ++를 독립형 앱으로 호출하십시오.
- 공유 라이브러리-C ++ 루틴을 공유 라이브러리 (dll)에 압축하고 Node.js에서 해당 루틴을 직접 호출하십시오.
- Node.js Addon-C ++ 코드를 기본 Node.js 모듈 / 애드온으로 컴파일하십시오.
Swig 및 C ++에주의 : http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
C ++ 소스 파일 (.C 또는 .cxx 파일에 표시됨)에서 SWIG를 실행하지 않는 것이 좋습니다. SWIG는 C ++ 클래스 선언을 구문 분석 할 수 있지만 원래 클래스 정의와 분리 된 선언을 무시합니다 (선언은 구문 분석되지만 많은 경고 메시지가 생성 될 수 있음). 예를 들면 다음과 같습니다.
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
C ++ 클래스가 .h 파일로만 제한되는 경우는 거의 없습니다.
또한 JavaScript를 지원하는 swig 버전은 swig-3.0.1 이상입니다.
foo::bar
어쨌든 정의로 무엇을 할 것인지 이해하지 못한다 . 클래스 멤버의 정의는 구현에 관한 것입니다. SWIG가 생성하는 래퍼는 모두 인터페이스에 관한 것입니다.
extension
입니다. Google C ++ NodeJS 확장