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.