node.js에서 C ++ 라이브러리를 어떻게 사용합니까?


답변:


66

노드 FFI .

node-ffi는 순수 JavaScript를 사용하여 동적 라이브러리를로드하고 호출하기위한 Node.js 애드온입니다. C ++ 코드를 작성하지 않고 기본 라이브러리에 대한 바인딩을 작성하는 데 사용할 수 있습니다.


5
다른 C ++ 컴파일러는 다른 ABI를 생성하므로 node-ffi를 사용하려면 C 인터페이스로 C ++ 코드를 래핑해야 할 수도 있습니다. 또는 적어도 Visual Studio가있는 Windows 에서이 작업을 수행해야했습니다. 이 작업을 수행하는 방법에 대한 자세한 내용 은 stackoverflow.com/questions/2045774/… 를 참조하십시오 . 아니면 래퍼없이 C ++에서 node-ffi를 사용할 수 있습니까?
팬케이크

1
이 의견 이후 1 년 이상이 걸렸지 만 C 래퍼없이 C ++ 라이브러리를 사용할 수 있습니까?
미키 데 아르카 인

node-ffi와 VS 2017/2019 컴파일 문제가 발생했습니다. 주요 PITA입니다! 파이썬 2.7에 의존합니까, 아니면 빌드 프로세스입니까? 표준 Win32 DLL을 위해 NodeJS에 LoadLibrary 메커니즘이 있어야합니까?
tgraupmann

78

그 질문에 대한 새로운 해답이 있습니다. 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는 이러한 것들을 발견하고 자동으로 자연적인 인터페이스를 생성합니다.


2
swig / node.js를 약간 사용한 후에는 swig가 배열을 반환하는 C ++ 함수 (보다 정확하게는 배열에 대한 포인터를 반환하는 함수)를 처리 할 수없는 것으로 보입니다. 즉, JavaScript 배열과 같은 것을 반환하고 swig가 자동으로 변환하는 함수를 C ++로 작성할 수없는 것 같습니다.
George

5
@George SWIG는 실제로 놀라운 도구이지만 마술은 아니며 C ++ 코드의 의미를 이해하고 해당 인터페이스를 생성 할 수있는 일반적인 AI는 아닙니다. C ++과 자바 스크립트의 의미, 소유권 개념 및 수명 관리가 근본적으로 어떻게 다른지주의하십시오.
enobayram

3
따라서 SWIG는 두 가지 방법으로 볼 수 있습니다. 바로 사용 가능한 작업을 수행하고 규칙에 따라 실행할 수있는 도구입니다. 즉, 배열을 반환하는 C ++ 함수에서 자바 스크립트 배열이 튀어 나오는 것을 기 대해서는 안됩니다. 대신 할 수있는 일은 C ++로 함수를 래핑하여 배열처럼 동작하는 객체를 반환하고 ( std::vector<>예 : just %include "std_vector.i") 자바 스크립트 측에서 다소 어색한 방식으로 조작 할 수 있습니다. 이 방법은 FFI를 직접 작성하는 것보다 훨씬 쉽고 안전합니다.
enobayram

3
SWIG를 사용할 수있는 다른 방법은 기계를 이해하는 것입니다. 그것을 사용하여 몇 달을 보내고, 그 기능을 자세히 배우십시오. 그런 다음 원하는 인터페이스를 생성 할 수 있습니다. C ++ 배열에 대한 자바 스크립트 배열을 반환하기를 원하지만, 할 수는 있지만 먼저 그러한 인터페이스에서 기대하는 정확한 의미를 표현하는 방법을 배우고 문제 도메인에 잘 매핑되는지 확인해야합니다.
enobayram

3
어느 쪽이든, 첫 번째 접근 방식으로 시작하고 SWIG 사용을 개선하는 것이 좋습니다. SWIG가 코드에서 수행하는 작업과 코드 조작 방법을 연구하는 것은 매우 고무적입니다.
enobayram


11

emscripten 을 사용 하여 C ++ 코드를 js로 컴파일 할 수 있습니다 .


16
OP의 목표가 컴파일 된 C ++의 성능 이점을 얻는 것이라면 문제가 될 것입니다.
그렉

7
@ 그렉하지만 여전히 고려할만한 가치가 있습니다. 사람들은 다양한 유형의 프로젝트를 위해이 페이지를 방문합니다. Emscripten은 C / C ++ 코드 기반이 있고 Nodejs에서 사용하고 싶을 때 좋은 옵션이라고 생각합니다.
AlexStack

1
- 영업의 목표는 컴파일 된 C ++의 성능 혜택을 얻을 경우 - 일부 혜택 특히 WASM으로, emscripten로 번역 : 오버 헤드없이 GC를, 적은 오버 헤드, 기본 정수, AOT 최적화를 분석하고 JIT.
ArtemGr

2

Node.js와 C ++를 연결하는 새로운 방법이 있습니다. 에서 약탈하십시오 .

편집은 가장 빠르고 쉬운 방법입니다 nbind . 비동기 애드온을 작성하려면 Asyncworkernan 클래스를 결합하면 됩니다.


1

다음은 Node.js를 사용하여 C ++를 웹에 가져 오는 흥미로운 기사입니다.

C ++ 코드를 Node.js 애플리케이션과 통합하는 세 가지 일반적인 방법-각 카테고리마다 많은 변형이 있지만 :

  1. 자동화-하위 프로세스에서 C ++를 독립형 앱으로 호출하십시오.
  2. 공유 라이브러리-C ++ 루틴을 공유 라이브러리 (dll)에 압축하고 Node.js에서 해당 루틴을 직접 호출하십시오.
  3. Node.js Addon-C ++ 코드를 기본 Node.js 모듈 / 애드온으로 컴파일하십시오.

0

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 이상입니다.


나는 SWIG이 foo::bar어쨌든 정의로 무엇을 할 것인지 이해하지 못한다 . 클래스 멤버의 정의는 구현에 관한 것입니다. SWIG가 생성하는 래퍼는 모두 인터페이스에 관한 것입니다.
enobayram
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.