2012-01-26 12 views
5

Después de seguir las instrucciones en el emscripten wiki, he logrado compilar una pequeña biblioteca C. Esto dio como resultado un archivo a.out.js.Utilizando una biblioteca C compilada de emscripten de node.js

estaba asumiendo que el uso de funciones de esta biblioteca (dentro de Node.js) algo como esto hubiera funcionado:

var lib = require("./a.out.js"); 
lib.myFunction('test'); 

Sin embargo esto no funciona. ¿Alguien puede ayudarme o señalarme algún tutorial básico relacionado con esto?

Respuesta

7

El problema aquí es que el archivo de a.out.js va a tener este aspecto

function myFunction() { 
    ... 
} 

No de esta

function myFunction() { 
    ... 
} 

exports.myFunction = myFunction; 

Usted tiene que escribir un script de construcción que enumera las fichas que desee a públicamente exporta desde cada programa C y agrega exports.<token> = <token>;\n al final de tu archivo para cada token.

+1

Después de algunas investigaciones encontré la solución en la página wiki de emscripten '[Interactuando con el código] (https://github.com/kripken/emscripten/wiki/Interacting-with-code) ', Combinando las ** exportaciones. ** con las funciones ** Pointer_stringify ** y ** allocate ** funciona – lostsource

+0

@lostsource ¿me puede mostrar un ejemplo? – noamtcohen

6

En realidad, todas las funciones ya se exportaron. JavaScript generado contiene las líneas siguientes:

var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 
// … 

if (ENVIRONMENT_IS_NODE) { 
    // … 
    module['exports'] = Module; 
} 

Si usted tiene una función llamada my_fun en el código C, entonces tendrá que Module._my_fun definido.

Sin embargo, hay algunos problemas con este enfoque.

El optimizador puede eliminar o cambiar el nombre de algunas funciones, por lo que siempre especifíquelas pasando -s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']". Las firmas de funciones en C++ son un poco destrozadas, por lo que es aconsejable que extern "C" { … } las que desea exportar.

Además, un enfoque directo requires JS to C type conversions. Es posible que desee ocultar mediante la adición de una nueva capa de API en el archivo agregado adjunto con --pre-js opción:

var Module = { 
    my_fun: function(some_arg) { 
    javascript to c conversion goes here; 
    Module._my_fun(converted_arg) // or with Module.ccall 
    } 
} 

Module objeto será mejorado posteriormente por todos los extras generados por emscripten, por lo que no se preocupe que se define aquí , no modificado.

Por último, seguramente querrá considerar Embind que es un mecanismo para exponer las simpáticas APIs de JavaScript provistas por Emscripten. (Requiere deshabilitar el último motor fastcomp).

Cuestiones relacionadas