Использование Emscripten скомпилированной библиотеки C из узла.JS


После выполнения инструкций на emscripten wiki мне удалось скомпилировать небольшую библиотеку C. Это привело к a.out.файл js.

Я предполагал, что использовать функции из этой библиотеки (внутри узла.js) что-то вроде этого сработало бы:

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

Однако это не удается. Может ли кто-нибудь помочь или указать мне на какой-то базовый учебник, связанный с этим?

2   5   2012-01-26 18:59:29

2 ответа:

Проблема здесь в том, что ваш файл a.out.js будет выглядеть следующим образом

function myFunction() {
  ...
}

Не так

function myFunction() {
  ...
}

exports.myFunction = myFunction;

Вам нужно написать сценарий сборки, который перечисляет токены, которые вы хотите публично экспортировать из каждой программы на языке Си, и добавляет exports.<token> = <token>;\n в конец файла для каждого токена.

Фактически все функции уже экспортированы. Сгенерированный JavaScript содержит следующие строки:

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

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

Если у вас есть функция с именем my_fun в коде C, то у вас будет Module._my_fun определено.

Однако с этим подходом есть некоторые проблемы. Оптимизатор может удалить или переименовать некоторые функции, поэтому всегда указывайте их, передавая -s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']". Сигнатуры функций в C++ немного искажены, поэтому целесообразно использовать extern "C" { … } те, которые вы хотите экспортировать.

Кроме того, такая прямой подход требует преобразования типа JS в C . Вы можете скрыть его, добавив еще один слой API в файле added attached with --pre-js option:

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

Module объект будет позже усилен всеми эмскриптен-генерируемыми лакомствами, так что не беспокойтесь, что он определен здесь, а не изменен.

И, наконец, вы наверняка хотите, чтобы рассмотреть Embind, которая представляет собой механизм для разоблачения хороший API-интерфейсы JavaScript с помощью Emscripten. (Требуется отключить новейший fastcomp базовая программа.)