FFI는 동적 C 라이브러리와 함께 작동합니다. 즉 동적 라이브러리를 외부에 노출해야합니다. C++에서는 다음과 같이 통근자 "C"이 작업을 수행 :
#ifdef __cplusplus
extern "C" {
#endif
int foo (int param){
int ret = 0;
// do C++ things
return ret;
}
int bar(){
int ret = 0;
// do C++ things
return ret;
}
#ifdef __cplusplus
}
#endif
이
은 동적 라이브러리 방법으로, C-가지로 C++ 기능을 사용할 수있게됩니다. 여기
는로 C++ lib 디렉토리를 컴파일 한 후, 자바 스크립트에서이 포장 방법입니다 libmylibrary.dll/.so를 :
쿨러를 많이 당신이 할 수있는 일이있다
var ffi = require('ffi');
var mylibrary = ffi.Library('libmylibrary', {
"foo": [ "int", ["int"] ],
"bar": [ "int", [] ]
});
. 확인해보십시오. here
노드 라이브러리 인 경우 모듈을 module.exports에 넣기 만하면됩니다. 내가 node-ffi-generate을 사용하지 않은
var ffi = require('ffi');
var mylibrary = ffi.Library('libmylibrary', {
"foo": [ "int", ["int"] ],
"bar": [ "int", [] ]
});
module.exports = {
fooSync : mylibrary.foo,
foo: mylibrary.foo.async,
barSync : mylibrary.bar,
bar: mylibrary.bar.async
};
,하지만 당신에 대한 래퍼의 이러한 종류를 생성하는 정말 멋진 외모 : 여기에 동기 & 비동기 방법으로, 위의 C++ 코드의 랩의 전체 예입니다. 나는이처럼 사용할 수
내가 mylibrary.js으로이 파일을 저장 한 경우 : "그것이 더"의 문제에 관해서는
var mylib = require('./mylibrary.js');
var num = mylib.fooSync(1);
// or
mylib.foo(1, function(er, num){
});
나는 대부분의 것들을 그렇게 생각한다. 당신이 당신의 방법 C를 extern C로 만들면, 그들은 다른 모든 언어에서도 작동 할 것입니다. 그 중 일부는 FFI를 가지고 있기 때문에, 당신은 당신의 목표 언어가 무엇이든 위의 간단한 것에 상응하는 것을 쓸 것입니다. 이는 기본 "load C++ lib"이외의 유지 관리 할 코드가 거의없고 "언어 X에 대해 올바르게 느끼기위한 서명이 엉망입니다"라는 의미입니다. 노드와 관련이 없습니다. 또 다른 보너스는 일반적인 공유 라이브러리 (자습서 예제에서 제공 한 sqlite와 같은)입니다. 여러분이 사용하는 버전이 무엇인지 정확하게 신경 쓰지 않거나 더 많은 C++ 코드로 감싸고 싶다면 사용하기 위해 컴파일해야합니다. FFI를 사용하면 미리 컴파일 된/설치된 lib를 자바 스크립트로 감쌀 수 있습니다.
코드에 상속, 가상 함수 및 템플릿을 많이 사용합니까? – aaronman
템플릿이 없습니다. 가상 기능이 없습니다. 어떤 상속, 비록 내가 필요하다면 이것을 피하기 위해 코드를 수정할 수는 있지만. – pancake
나는 래퍼를 쓰는 것이 상대적으로 쉽다고 생각한다. – aaronman