Используя скомпилированную библиотеку C emscripten из node.js - PullRequest
5 голосов
/ 26 января 2012

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 14 мая 2014

На самом деле все функции уже экспортированы.Сгенерированный 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.)

7 голосов
/ 26 января 2012

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

function myFunction() {
  ...
}

Не так

function myFunction() {
  ...
}

exports.myFunction = myFunction;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...