用c++的addon在nodejs中输出helloworld
这是我在博客园的第一篇博客,作为一个cxy必须要对这个世界说点什么,那肯定就是一句helloworld了
在nodejs中可以通过require进入c++编译成的.node文件,并使其成为一个模块进行引入
那么,通过nodejs输出helloworld要达到什么样的效果呢

(这里test.js内部可以通过console.log("hello, world!")来实现,但这不是我们今天的目的)
先来看一下test.js内部的代码
const hello = require('../build/Release/hello.node')
console.log(hello.say())
这里的hello.node是通过c++编译成的addon,通过require引入。然后通过控制台输出hello模块的say函数的返回值
为了完成这项操作,先创建一个文件夹,添加文件如下

其中hello.hpp是没有内容的,可以不添加
然后是hello.cpp中的代码
#include <iostream> #include <string> #include <node.h> #include <nan.h> NAN_METHOD(say) { info.GetReturnValue().Set(Nan::New<v8::String>(std::string("hello, world!")).ToLocalChecked()); } NAN_MODULE_INIT(InitHello) { try { NAN_EXPORT(target, say); } catch (std::exception e) { std::cout << e.what(); } } NODE_MODULE(hello, InitHello)
为了能够在nan层实现c++和nodejs的数据交互,需要通过npm install --save-dev nan来安装nan相关文件
在cpp(或hpp)中引用node.h和nan.h
NODE_MODULE规定整个模块的入口
NAN_METHOD声明函数,函数通过NAN_EXPORT导出,使nodejs可以使用函数
addon模块通过cmake-js进行编译,所以需要添加CMakeLists.txt,里面写入cmake-js需要的信息,可以通过npm install --save-dev cmake-js@5.2.0 来安装本地的cmake-js
CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
set(TARGET_MODULE_NAME "hello")
project(${TARGET_MODULE_NAME})
include_directories(${CMAKE_JS_INC})
file(GLOB SOURCE_FILES ./src/*.cpp ./src/*.hpp)
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})
接下来编辑package.json
使最后生成hello.node的模块,其本质是动态链接库(dll)
可以在./build/Release中看见hello.node(cmake-js默认为Release模式)

在cmd中进入tests目录,使用node test.js命令成功向世界问好
https://github.com/fw23t9/MyNanAddon/tree/master/0.helloworld
浙公网安备 33010602011771号