web

Emscripten Embind(C++ 함수를 JavaScript에 바인딩) 사용해 보기

nowoodeel 2024. 11. 19. 23:48
728x90

Embind는 C++ 함수와 클래스를 JavaScript에 바인딩해서 사용할 수 있다.

자세한 예제
https://github.com/emscripten-core/emscripten/tree/main/test/embind

 

emscripten/test/embind at main · emscripten-core/emscripten

Emscripten: An LLVM-to-WebAssembly Compiler. Contribute to emscripten-core/emscripten development by creating an account on GitHub.

github.com

 

간단한 예제

EMSCRIPTEN_BINDINGS() 블록을 사용하여 C++ lerp() 함수를 JavaScript에 노출한다.

// lerp.cpp
#include <emscripten/bind.h>

using namespace emscripten;

float lerp(float a, float b, float t) {
    return (1 - t) * a + t * b;
}

EMSCRIPTEN_BINDINGS(my_module) {
    function("lerp", &lerp);
}

 

lerp.cpp 빌드

emcc로 -lembind 옵션을 추가하여 컴파일 한다.

emcc -lembind -o lerp.js lerp.cpp

또는 Docker Image에 emsdk를 설치한 것을 사용해도 된다.
https://nowoodeel.tistory.com/47

 

Docker image로 Emscripten SDK(emsdk) 설치 하기

Emscripten은 C/C++ 코드와 같은 네이티브 프로그램을 웹에서 실행할 수 있는자바스크립트로 변환해 주는 오픈 소스 컴파일러.Emscripten은 WebAssembly(Wasm) 또는 자바스크립트(JavaScript)로 컴파일된 코드

nowoodeel.tistory.com

Docker image의 emsdk 컴파일

 

lerp.js 로드

lerp.js를 <script> 태그를 통해 로드한다. 
onRuntimeInitialized Emscripten의 WebAssembly(Wasm), JavaScript 모듈의 모든 기본적인 설정과 메모리 할당이 완료된 후 호출되는 콜백 함수이다.

<!doctype html>
<html>
  <script>
    var Module = {
      onRuntimeInitialized: function() {
        console.log('lerp result: ' + Module.lerp(1, 2, 0.5));
      }
    };
  </script>
  <script src="lerp.js"></script>
</html>

console.log에 결과를 출력한다. embind에서 노출된 모든 심볼은 Emscripten Module 객체에서 사용할 수 있다.

 

Python에서 간단한 HTTP 서버 실행하기

python -m http.server 8080

 

실행

 

 

반응형