나는 다음과 같은 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>