Estoy siguiendo las instrucciones de la documentación de Emscripten aquí y quiero practicar con ejemplos mínimos. Mi objetivo final es crear una biblioteca de C++, compilarla en un solo archivo binario wasm y luego usar estos métodos compilados en una aplicación web de interfaz pura.
No entiendo cuál es el propósito de llamar a los métodos de C ++ con "ccall" cuando puede crearlos directamente desde "Módulo". Por ejemplo, puedo usar Module._doubleNumber(9);
, que es más corto que Module.ccall('doubleNumber','number', ['number'], [9]);
.
¿Cuál es la diferencia entre llamar a uno u otro?
Aquí está el código completo:
extern "C" { int doubleNumber( int x ) { int res = 2*x; return res; } }
Compilado con
emcc main.cpp -o main.js -sEXPORTED_FUNCTIONS=_doubleNumber -sEXPORTED_RUNTIME_METHODS=ccall
Estoy usando un documento html simple para probar los resultados:
<html> <head> <meta charset="utf-8"> <title>WASM Demo</title> </head> <body> <script type="text/javascript" src="main.js"></script> <script type="text/javascript"> Module.ccall('doubleNumber','number', ['number'], [9]); // 18 Module._doubleNumber(9); // 18 </script> </body> </html>
No hay diferencia en tal el pequeño ejemplo. Puede haber problemas en proyectos grandes.
Module.ccall
puede realizar una llamada asíncrona con el parámetro async=true
, mientras que la llamada a la función exportada Module._doubleNumber
siempre está sincronizada._doubleNumber
se cambiará a otro nombre, generalmente impredecible, y Module._doubleNumber
no estará definido.-sEXPORTED_FUNCTIONS=_doubleNumber
evita la minimización de nombres y se puede usar para bibliotecas pequeñas de C. Una gran biblioteca C requeriría una tonelada de elementos enumerados en EXPORTED_FUNCTIONS
, y deberá tener en cuenta la longitud limitada de la línea de comando.