Я работаю над проектом, который использует указанную версию HTML5 Canvas из C ++ / Wasm. В настоящее время у меня есть импорт, void drawImageFromURL(const char *, int, int, int, int, float)
и экспорт, void frame(void)
. Моя проблема заключается в том, что drawImageFromURL
в полученном Wasm импортируется как _Z16drawImageFromURLPKciiiif
, а frame
экспортируется как _Z5framev
.
Я строю с использованием сценария оболочки под названием wasmc
, который использует clang (у меня был только плохой опыт работы с Emscripten), который содержит следующий код:
#!/bin/bash
clang --target=wasm32 -Wl,--export-dynamic -Wl,--no-entry -Wl,--allow-undefined -Wl,--import-memory $* --sysroot /home/linuxbrew/.linuxbrew -I/usr/include -L/usr/lib -nostdlib
Я использую его так:
$ wasmc -o main.wasm main.cpp -Oz
I Я использую 64-битный Debian GNU / Linux 9 (растянутый) (скопированный из настроек GNOME) на Intel® Core™ i5-9400F CPU @ 2.90GHz × 6
ЦП с 7,7 ГБ ОЗУ и Radeon RX 580 Series (POLARIS10, DRM 3.27.0, 4.19.0- 5-amd64, LLVM 7.0.0) с 235,8 ГБ дискового пространства.
Я использую Clang версии 9.0.0, установленную через Linuxbrew ( Homebrew для Linux).
Буду очень признателен за помощь.
Спасибо!
Вот исходный код всех файлов в моем проекте: main.cpp
:
extern void drawImageFromURL(const char *url, int x, int y, int h, int w, float θ);
__attribute__((visibility("default")))
void frame() {
static float θ = 0;
drawImageFromURL("/gear.png", 50, 50, 100, 100, θ);
θ += 0.01;
}
main.wasm
(S-выражения, сгенерированные расширением VS Code WebAssembly):
(module
(type $t0 (func (param i32 i32 i32 i32 i32 f32)))
(type $t1 (func))
(import "env" "memory" (memory $env.memory 2))
(import "env" "_Z16drawImageFromURLPKciiiif" (func $drawImageFromURL_char_const*__int__int__int__int__float_ (type $t0)))
(func $frame__ (type $t1)
i32.const 1028
i32.const 50
i32.const 50
i32.const 100
i32.const 100
i32.const 0
f32.load offset=1024
call $drawImageFromURL_char_const*__int__int__int__int__float_
i32.const 0
i32.const 0
f32.load offset=1024
f64.promote/f32
f64.const 0x1.47ae147ae147bp-7 (;=0.01;)
f64.add
f32.demote/f64
f32.store offset=1024)
(table $T0 1 1 anyfunc)
(global $g0 (mut i32) (i32.const 66576))
(export "_Z5framev" (func $frame__))
(data (i32.const 1024) "\00\00\00\00")
(data (i32.const 1028) "/gear.png\00"))
index.html
:
<!doctype html>
<html>
<head>
<title><!-- Ommitted for anonymity --></title>
</head>
<body>
<canvas id="canvas"></canvas>
<script src="app.js"></script>
</body>
</html>
app.js
:
function ptrToStr(mem, ptr, width = 'Uint8') {
let dv = new DataView(mem.buffer);
let str = '';
for(let i = 0; i < strlen(mem, ptr, width); i++) {
str += String.fromCharCode(dv['get' + width](ptr + i));
}
return str;
}
function strlen(mem, ptr, width = 'Uint8') {
let dv = new DataView(mem);
let i = 0;
let ch = () => dv['get' + width](ptr + i);
while(ch() != 0) {
i++;
}
i++;
return i;
}
/** @type {HTMLCanvasElement} */
let canv = document.getElementById('canvas');
fetch('main.wasm')
.then(res => res.arrayBuffer())
.then(arrbuf => WebAssembly.instantiate(arrbuf, {
env: {
memory: new WebAssembly.Memory({initial: 10}),
_Z16drawImageFromURLPKciiiif(pUrl, iX, iY, iH, iW, fTheta) {
let img = document.createElement('image');
img.url = pUrl;
img.height = iH;
img.width = iW;
canv.getContext('2d').drawImage(img, iX, iY);
}
}
})).then(mod => main(mod));