테스트 사이트 - 개발 중인 베타 버전입니다

c++로 만들어진 코드를 바인딩하기

· 4년 전 · 1669 · 1

1. N-API를 사용하여 C++ 애드온 정의

 

 - N-API 는  c++ 애드온하기 위한 빌드, v8엔진과 독립적이며 안정적인 ABI ( Application Binary Interface )

 - js만으로 사용하기에는 OS API를 접근하기 힘들기 때문에 대안이 될 수 있음

 - 유용한 c++ 라이브러리를 래핑하여 개발할 수 있음

 - 성능 좋은 c++모듈을 바인딩할 수 있음

 

2. 필요패키지 및 실행환경

 - node-gyp

 - bindings

 - node-addon-api

 - 실행환경 : g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

 

3. 패키지 설치

 

프로젝트 디렉토리를 생성하고 npm 초기화

[code]

$ npm init

[/code]

 

node-gyp를 전역설치를 합니다.

[code]

$ npm install -g node-gyp

[/code]

 

bindings를 설치합니다.

[code]

$ npm install bindings

[/code]

 

node-addon-api 설치합니다.

[code]

$ npm install node-addon-api

[/code]

 

4. 바인딩 설정

 

vi로 binding.gyp를 파일을 만들어서 아래처럼 설정합니다.

[code]

{

  "targets": [

  {

     "cflags!": [ "-fno-exceptions" ],

     "cflags_cc!": [ "-fno-exceptions" ],

     "include_dirs" : [

         "<!@(node -p \"require('node-addon-api').include\")"

      ],

    "target_name": "./gnu_hello",

 

    "sources": [ "gnu_hello.cpp" ],

     'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ]

   }

  ]

}

[/code]

 

5. cpp 라이브러리 만들기 

 

//gnu_hello.cpp

[code]

#include <napi.h>

 

Napi::String GnuMsg(const Napi::CallbackInfo& info) {

//javascript를 생성하위한 객체

Napi::Env env = info.Env();

 

return Napi::String::New(env, "Hellow gnu world");

}

 

Napi::Object InitAll(Napi::Env env, Napi::Object exports) {

exports.Set(Napi::String::New(env, "GnuMsg"), Napi::Function::New(env, GnuMsg));

return exports;

}

 

NODE_API_MODULE(gnu_hello, InitAll);

[/code]

 

6. c++  빌드하기

 

[code]

 $ node-gyp rebuild

[/code]

빌드에 성공을 하면 gyp info ok가 나옵니다. 저는 빌드를 우분투 20.0.4 에서 하였습니다. build 디렉토리에 Release 디렉토리가 생길텐데 그것도 한번 확인해 보셔야 합니다.

31837381_1632664400.072.jpg

gnu_hello파일이 생성되었습니다. 이 경로로 직접 바인딩하여 사용할 수 있습니다.

31837381_1632664606.5224.jpg

 

 

7. nodejs 사용하기

 

//index.js 파일 생성하여 아래 코드처럼 만들어주세요

[code]

const addon = require("bindings")("gnu_hello");


 

const str = addon.GnuMsg();


 

console.log(str);

[/code]

 

 

8. nodejs 프로젝트 실행

 

아래 코드를 실행해 봅시다. 아래 이미지 처럼 Hellow gnu world가 나옵니다.

[code]

$ node index.js

[/code]

 

31837381_1632664925.9382.jpg

 

 

참고 링크 : https://morioh.com/p/e1a6f79af449

참고 링크 : https://nodejs.org/api/addons.html#addons_worker_support

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 1개

3년 전
아니 이런것도 되는군요. 몰랐네요. 좋은 정보감사합니다.

게시글 목록

번호 제목
17043
17042
17025
17015
17001
16998
16994
16988
16985
16983
16981
16979
16978
16976
16968
16967
16957
16956
16955
16951
16950
16949
16932
16930
16913
16909
16906
16905
16904
16894