码迷,mamicode.com
首页 > Web开发 > 详细

使用makefile编译nodejs模块

时间:2015-02-18 17:44:41      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:nodejs   makefile   addons   

使用过node-gyp编译nodejs的addon插件的人,一定很好奇,node-gyp到底帮你做了什么事情,还有,如果我们自己做,难度到底如何。本文不作makefile文件语法的讲解,如果你不懂, 没关系,能看懂基本流程就好。抛开node-gyp,你会发现,有些复杂的东西其实是基于很简单的原理。

环境

操作系统为centos7,已经安装了nodejs,版本为0.10.36,其实差不多新的版本就行。编译链也已经准备好,g++命令啦。

编写代码

源文件hello.cc,很简单,基本和官网的hello world例子一样。

#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

makefile的一些参数,参考了node-gyp生成的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。

编译

在当前目录下执行make就行。如果一切顺序,在当前目录下会生成build目录,里面有我们想要的hello.node。

测试

编写测试代码test.js
var module = require('./build/hello');

var value = module.hello();
console.log(value);

执行node test.js,oh,居然输出了

world

原来,没有node-gyp,你也可以自由的编写nodejs的模块的。需要的仅仅是一些makefile的知识。这些资料网上也不容易找,希望能帮上大家。


使用makefile编译nodejs模块

标签:nodejs   makefile   addons   

原文地址:http://blog.csdn.net/limite_god/article/details/43877159

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!