2012-01-26 23 views
5

Dopo le seguenti istruzioni su emscripten wiki sono riuscito a compilare una piccola libreria C. Ciò ha provocato un file a.out.js.Utilizzo di una libreria C compilata emscripten da node.js

ero dal presupposto che per utilizzare le funzioni di questa libreria (entro node.js) qualcosa di simile avrebbe funzionato:

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

Tuttavia questo fallisce. Qualcuno può aiutarmi o indicarmi un tutorial di base relativo a questo?

risposta

7

Il problema qui è che il file a.out.js è andare a guardare come questo

function myFunction() { 
    ... 
} 

Non così

function myFunction() { 
    ... 
} 

exports.myFunction = myFunction; 

Hai bisogno di scrivere uno script di build che elenca i gettoni che si desidera a pubblicamente esporta da ogni programma C e aggiunge exports.<token> = <token>;\n alla fine del file per ogni token.

+1

Dopo alcune ricerche ho trovato la soluzione nella pagina wiki emscripten '[Interagire con il codice] (https://github.com/kripken/emscripten/wiki/Interacting-with-code) ', Combinando le ** esportazioni. ** con le funzioni ** Pointer_stringify ** e ** allocate ** fa il lavoro – lostsource

+0

@lostsource puoi mostrarmi un esempio? – noamtcohen

6

In realtà, tutte le funzioni sono già state esportate. Generato JavaScript contiene le righe seguenti:

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

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

Se hai una funzione chiamata my_fun nel codice C, allora si dovrà Module._my_fun definito.

Ci sono alcuni problemi con questo approccio, però.

L'ottimizzatore può rimuovere o rinominare alcune funzioni, quindi specificarle sempre passando -s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']". Le firme delle funzioni in C++ sono un po 'storpiate, quindi è consigliabile scrivere su extern "C" { … } quelle che si desidera esportare.

Inoltre, tale approccio diretto requires JS to C type conversions. Si consiglia di nascondere con l'aggiunta di un ulteriore livello di API nel file aggiunto allegato con --pre-js opzione:

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

Module oggetto verrà poi arricchito da tutte le chicche Emscripten-generati, quindi non preoccupatevi che è definito qui , non modificato.

Infine, si vorrà sicuramente considerare Embind che è un meccanismo per esporre le API JavaScript fornite da Emscripten. (Richiede disabilitare il backend di fastcomp più recente.)

Problemi correlati