2017-11-12 25 views
3

나는 다음과 같은 bash는 스크립트를 통해 컴파일 할 때 제대로 작동 작은 WebAssembly 프로그램이 중단됩니다 :제거 "-s ONLY_MY_CODE = 1"컴파일 인수는 WebAssembly 프로그램이

source_list="../../src/cpp/main/main.cc" 
emcc -std=c++11 $source_list -o out/index.html -O1 -s WASM=1 -s ONLY_MY_CODE=1 -s EXPORTED_FUNCTIONS="['_go']" 
cp ../../src/html/index.html out/ 

내 브라우저에서 프로그램을로드 할 때 JS 콘솔에 hi there이 인쇄되어 있습니다.

그러나 고급 코드를 사용하기 위해 -s ONLY_MY_CODE=1 항목을 제거하여 컴파일 스크립트를 변경했습니다. 그때 컴파일하고 내가 브라우저에서 다음과 같은 오류 메시지가 표시 프로그램을 실행할 때 모든 파일에

더 이상의 변화없이

이 :

index.html:1 Uncaught (in promise) LinkError: WebAssembly Instantiation: Import #0 module="env" function="DYNAMICTOP_PTR" error: global import must be a number at <anonymous> Promise rejected (async) (anonymous) @ index.html:35

이 문제를 어떻게 해결할 수 있습니까?

main.cc

extern "C" 
{ 
    extern void print(char *message); 

    void go() 
    { 
     print("hi there"); 
    } 
} 

index.html을

<script> 

    var webSocket; 
    const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 }); 
    const buffer = new Uint8Array(memory.buffer); 
    var exports; 

    function toJsStr(offset){ 
     var s=""; 
     for(;;){ 
      var b = buffer[offset++]; 
      if(b == 0) 
       return s; 
     s += String.fromCharCode(b); 
    } 
    } 

    function print(offset){ 
    console.log(toJsStr(offset)); 
    } 

    fetch('index.wasm').then(response => 
    response.arrayBuffer() 
).then(bytes => { 
     var imports = {}; 
     imports.env = {}; 
     imports.env.memory = memory; 
     imports.env.memoryBase = 0; 
     imports.env.table = new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' }); 
     imports.env.tableBase = 0; 
     imports.env._print = print; 

     return WebAssembly.instantiate(bytes, imports); 
    } 
).then(module => { 
     exports = module.instance.exports; 

     exports._go(); 
     } 
); 
    </script> 

답변

1

Emscripten WASM 생성 된 코드 내의 실행을 포함한다. 이 생성 된 런타임을 사용하면 광범위한 C/C++ 기능을 지원할 수 있으므로 복잡한 코드베이스를 훨씬 쉽게 포팅 할 수 있습니다. 이 런타임에는 JavaScript 코드도 포함되어 있으므로 C/C++ 코드베이스를 컴파일하면 wasm 파일, JavaScript 파일 및 HTML 파일도 출력됩니다. HTML 파일은 코드에 대한 템플릿 기반 테스트 도구입니다.

ONLY_MY_CODE으로 컴파일하면이 런타임의 대부분을 없애기 때문에 JavaScript 및 HTML 파일도 더 이상 생성되지 않습니다. ONLY_MY_CODE을 사용할 때 사용할 수있는 기능은 실제로 제한되어 있습니다. 예를 들어 문자열을 사용할 수 없거나 내 보낸 함수에서 숫자 유형 이외의 다른 값을 반환 할 수 없습니다.

결과적으로 귀하의 예에서 ONLY_MY_CODE을 제거하면 생성 된 JavaScript 파일을 통해 wasm 파일을로드해야합니다. 이렇게하면 wasm 코드가로드되고 생성 된 런타임 코드와 '결합'하기 위해 내보내기/가져 오기/메모리를 처리합니다. 오류 메시지에 나타나는 DYNAMICTOP_PTR 함수는이 런타임의 구성 요소 중 하나입니다.