Вопрос по c, node.js – Можно ли написать расширение node.js в C (не C ++)?

18

Быстрый поиск в Google дает по крайней мере один учебник для написанияC ++ "Hello World" для node.js, но неясно, возможно ли написать такое расширение, используя только C. Если это возможно, с какими проблемами / ограничениями я столкнусь?

Ссылка на ваш учебник C ++ поможет lupz

Ваш Ответ

5   ответов
6

node-ffi: Интерфейс внешней функции Node.js
аддон для загрузки и вызова динамических библиотек с использованием чистого JavaScript. Его можно использовать для создания привязок к собственным библиотекам без написания кода на C
https://github.com/node-ffi/node-ffi

SWIG: Упрощенный генератор оболочек и интерфейсов
(он создает оболочки для многих языков, что решает много проблем одновременно)
http://www.swig.org/

emscripten
Компилирует C и C ++ в высокооптимизируемый JavaScript, который работает даже в сети с почти естественной скоростью, без плагинов.
http://kripken.github.io/emscripten-site/

15

если хотите, но вам понадобится хотя бы небольшой кусочек кода C ++, чтобы склеить ваш код C с Node.

Как вы уже видели в своем HelloWorld, расширения полагаются наv8.h а такжеnode.h заголовки, которые имеют все классы, которые ожидает Node. Без них вы не сможете должным образом создать объект JS для экспорта обратно в Node.

Тем не менее, вы можете довольно легко просто написать небольшой набор функций C ++, которые просто вызывают функции C, и обернуть некоторую структуру C.

2

который напрямую взаимодействует с node.js, должен быть написан на C ++.

Выcould записыватьextern "C" обертки, использующие непрозрачные типы для всего, что вам нужно отnode.h а такжеv8.h, но, вероятно, вместо этого проще использовать C ++ (что, конечно, может вызывать код C).

5

используя extern & quot; C & quot; синтаксис

Пример:

#define BUILDING_NODE_EXTENSION
#include <node.h>

extern "C" void f(int i, char c, float x);

using namespace v8;

если у вас есть несколько функций C, то они могут быть сгруппированы через фигурные скобки:

extern "C" {
  void   f(int i, char c, float x);
  int    g(char* s, char const* s2);
  double sqrtOfSumOfSquares(double a, double b);
}

затем вызовите функцию из функции C ++:

Handle<Value> MyFunction(const Arguments& args) {
  HandleScope scope;
   f(7, 'x', 3.14);    // <--- 
  return scope.Close(String::New("Hello"));
}

Handle<Value> CreateFunction(const Arguments& args) {
  HandleScope scope;

  Local<FunctionTemplate> tpl = FunctionTemplate::New(MyFunction);
  Local<Function> fn = tpl->GetFunction();
  fn->SetName(String::NewSymbol("theFunction")); // omit this to make it anonymous

  return scope.Close(fn);
}

void Init(Handle<Object> target) {
  target->Set(String::NewSymbol("createFunction"),
      FunctionTemplate::New(CreateFunction)->GetFunction());
}


NODE_MODULE(addon, Init)

Примечание. Использование примера кода изNodejs Addons

8

https://github.com/wesolows/v8plus

v8+: Node addon C++ to C boundary

This layer offers a way to write at least simple Node addons in C without all the horrible C++ goop you'd otherwise be expected to use. That goop still exists, but you don't have to write it. More importantly, you can write your module in a sane programming environment, avoiding the confusing and error-prone C++ semantics.

похоже, он не будет работать для версий & gt; Node.js 0.10, только что подал проблему, чтобы узнать наверняка

Похожие вопросы