chrome - ¿Cómo compilo un archivo C++ en WebAssembly?
webassembly download (4)
Supongamos que tengo un archivo C ++ simple e independiente ( math.cpp
) como este:
int add(int x, int y) {
return x + y;
}
¿Cómo lo compilaría en WebAssembly ( math.wasm
)?
Nota: Estoy usando la cadena de herramientas Clang.
Actualmente, la forma más fácil de compilar C y C ++ es con emscripten . Los componentes que menciona son todos los componentes, pero emscripten es una cadena de herramientas completa que admite la creación de extremo a extremo e incluye todas las partes que necesita, incluidas libc / libc ++, y una variedad de otras bibliotecas útiles. Es compatible con la orientación tanto de asm.js como de wasm.
Encontré esta esencia para ser muy útil.
Básicamente, estos son los pasos:
- (compile llvm y clang 5.0.0 o superior con
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
) Compile el .cpp soure to llvm bitcode con clang:
clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc
Compile el código de bits para s-assembly:
llc -asm-verbose=false -o math.s math.bc
Use la herramienta s2wasm de binaryen para crear un archivo .wast
s2wasm math.s > math.wast
Use la herramienta wast2wasm de WABT para traducir el archivo textual .wast al binario .wasm:
wast2wasm -o math.wasm math.wast
Algunos de los pasos parecen redundantes, pero aún no he encontrado una herramienta que permita accesos directos. (Sería bueno si llc pudiera compilar directamente en .wasm, o si s2wasm realmente creara archivos binarios .wasm como su nombre lo indica.) De todos modos, una vez que la cadena de herramientas se está ejecutando es relativamente indolora. Sin embargo, tenga en cuenta que todavía no hay bibliotecas estándar de C o C ++ para el ensamblaje web.
Alternativamente, si necesita el archivo .wasm solo para probar cosas, puede escapar sin todos los problemas de la cadena de herramientas. Vaya a https://mbebenita.github.io/WasmExplorer/ , pegue su código C / C ++ y descargue el archivo .wasm compilado.
Gracias @noontz y @ LB-- por señalar eso
En realidad, como lo sugieren los comentarios en la lista, puedes saltar los binarios y compilar directamente a wasm desde Clang / LLVM. Actualmente estoy usando la siguiente línea de comandos para C ++:
clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm / --optimize=3 --output test.wasm
Un poco tarde para esta respuesta, pero hay hermosas herramientas en línea para compilar tus scripts.
Por ejemplo, estoy usando este. Esa que te da una opción mínima de compilación (C, C ++, std99 ...) pero hay suficientes: https://wasdk.github.io/WasmFiddle/
Y dependiendo de cómo lo vaya a utilizar, puede elegir entre diferentes idiomas, como x86, código Buffer. También puedes compartir tu código, tipo de funciones que me parecen geniales cuando trabajas con otro amigo: https://wasdk.github.io/WasmFiddle/?gus9d :)
Emscripten viene con todo lo necesario para compilar un archivo C ++ en wasm. Emscripten también tiene un SDK que facilita la vida a la hora de instalar todas las herramientas necesarias.
Sin embargo, de forma predeterminada, Emscripten agregará algo de código de marco a su archivo wasm y generará algunos html y javascript.
Es posible crear un archivo wasm mínimo con Emscripten que no incluya ningún código de marco, javascript o html. Usando las opciones -s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1
mientras compila con emcc
o em++
le dará un archivo wasm mínimo.
El siguiente comando exportaría un archivo wasm mínimo usando tus ejemplos y Emscripten:
em++ math.cpp -o math.wasm -Oz -s SIDE_MODULE=1 -s WASM=1 -s "EXPORTED_FUNCTIONS=[''_add'']" -s ONLY_MY_CODE=1