На самом деле все функции уже экспортированы.Сгенерированный JavaScript содержит следующие строки:
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';
// …
if (ENVIRONMENT_IS_NODE) {
// …
module['exports'] = Module;
}
Если в вашем коде C есть функция с именем my_fun
, то у вас будет определено Module._my_fun
.
Есть некоторые проблемы соднако этот подход.
Оптимизатор может удалять или переименовывать некоторые функции, поэтому всегда указывайте их, передавая -s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']"
.Сигнатуры функций в C ++ немного искажены, поэтому целесообразно extern "C" { … }
экспортировать те, которые вы хотите экспортировать.
Кроме того, такой прямой подход требует преобразования типов JS в C .Возможно, вы захотите скрыть это, добавив еще один слой API в файл, добавленный с параметром --pre-js
:
var Module = {
my_fun: function(some_arg) {
javascript to c conversion goes here;
Module._my_fun(converted_arg) // or with Module.ccall
}
}
Module
объект будет позже улучшен всеми созданными Emscripten вкусностями, так чтоНе беспокойтесь, что он здесь определен, а не изменен.
Наконец, вы наверняка захотите рассмотреть Embind , который представляет собой механизм для представления хороших JavaScript API, предоставляемых Emscripten.(Требуется отключение новейшего бэкэнда fastcomp.)