使用makefile编译nodejs模块
使用过node-gyp编译nodejs的addon插件的人,一定很好奇,node-gyp到底帮你做了什么事情,还有,如果我们自己做,难度到底如何。本文不作makefile文件语法的讲解,如果你不懂, 没关系,能看懂基本流程就好。抛开node-gyp,你会发现,有些复杂的东西其实是基于很简单的原理。
环境
编写代码
#include <stdio.h> #include <stdlib.h> #include <node/node.h> #include <node/v8.h> using namespace v8; /** * 输出world */ Handle<Value> hello(const Arguments& args) { HandleScope scope; return scope.Close(String::New("world")); } void init(Handle<Object> exports) { exports->Set(String::NewSymbol("hello"), FunctionTemplate::New(hello)->GetFunction()); } NODE_MODULE(hello, init)
当我们调用模块的hello方法的时候,希望输出world。
Makefile
CC = g++ #output dir OUTDIR = ./build #the moudle name MODULE_NAME = hello.node #target path TARGET = $(OUTDIR)/$(MODULE_NAME) #可以定义变量 objs = $(OUTDIR)/hello.o CPPFLAGS = -shared -fPIC LINKFALGS = -shared -pthread -rdynamic -m64 -lpthread -Wl,-soname=$(MODULE_NAME) all: $(OUTDIR) $(objs) flock $(OUTDIR)/linker.lock $(CC) $(LINKFALGS) -o $(TARGET) -Wl,--start-group $(objs) -Wl,--end-group $(OUTDIR): mkdir $@ $(objs): $(OUTDIR)/%.o: %.cc $(CC) -c $(CPPFLAGS) $< -o $@ #声明clean是一个伪目标 .PHONY: clean clean: -rm -rf $(OUTDIR) -rm -f $(TARGET)
all是默认的目标,在子目录build下生成hello.node。
编译
测试
var module = require('./build/hello'); var value = module.hello(); console.log(value);
执行node test.js,oh,居然输出了
world
原来,没有node-gyp,你也可以自由的编写nodejs的模块的。需要的仅仅是一些makefile的知识。这些资料网上也不容易找,希望能帮上大家。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。