当前位置: 首页 > 后端技术 > Node.js

Node.js调用C++函数

时间:2023-04-03 11:37:33 Node.js

新手不好写。如果想让node.js调用C++函数,首先要将C++代码编译成二进制.node文件。node.js官方文档中的C++addonshttps://nodejs.org/dist/lates...介绍了如何将C++代码编译成二进制.node文件。一、步骤:1、首先在项目目录下执行npminstall-gnode-gyp下载node-gyp模块,配置环境参考https://github.com/nodejs/nod。2.这个在node官方文档中Example//addon.cc#includenamespacedemo{usingv8::Exception;usingv8::FunctionCallbackInfo;usingv8::Isolate;usingv8::Local;usingv8::Number;usingv8::Object;usingv8::String;usingv8::Value;//这是“添加”方法的实现//输入参数使用//constFunctionCallbackInfo&argsstructvoidAdd(constFunctionCallbackInfo&args){隔离*isolate=args.GetIsolate();//检查传递的参数数量。if(args.Length()<2){//抛出一个传递回JavaScript的错误isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate,"Wrongnumberofarguments")));返回;}//检查参数类型if(!args[0]->IsNumber()||!args[1]->IsNumber()){isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate,"错误参数")));返回;}//执行操作doublevalue=args[0]->NumberValue()+args[1]->NumberValue();Localnum=Number::New(isolate,value);//设置返回值(使用传入的//FunctionCallbackInfo&)args.GetReturnValue().Set(num);}voidInit(Localexports){NODE_SET_METHOD(exports,"add",Add);}NODE_MODULE(NODE_GYP_MODULE_NAME,Init)}//命名空间demo3.然后在项目目录下使用类似JSON的格式创建一个在项目顶层调用的binding.gyp文件,内容为{"targets":[{"target_name":"addon","sources":["addon.cc"]}]}4.在终端输入node-gypconfigure命令生成build文件夹,然后输入node-gypbuild命令生成并编译addon.node文件5.在node文件中这样作为test.js文件,constaddon=require('./build/Release/addon')调用生成的模块//test.jsconstaddon=require('./build/Release/addon');console.log('Thisshouldbeeight:',addon.add(3,5));//结果为82.例子最近公司让我研究node调用C++,C++的代码是调用自己开发的函数GDAL库调用tile.cc文件中的头文件,#include调用的gdal_priv.h和ogrsf_frmts.h头文件在gdal/include文件夹下,所以在binding.gyp文件中的source后面加上“include_dirs”:["./gdal/include"],如果现在运行node-gypconfigurebuild命令,会报“unresolvedexternalsymbol”的错误。这是因为需要添加调用的链接库,需要添加binding.gyp文件'libraries':["../gdal/lib/gdal_i.lib",],binding.gyp文件位于这次是{"targets":[{"target_name":"addon","sources":["./C++_02/tile.cc"],"include_dirs":["./gdal/include"],'libraries':["../gdal/lib/gdal_i.lib",],}]}这时候再执行node-gypconfigurebuild命令生成addon.node文件没有报错,但是当我运行test.js文件constaddon=require('./build/Release/addon')varimagefile="/vsicurl/http://....../cog.tif";varx=160;vary=83;varl=9;console.log(addon.tileload(imagefile,x,y,l));会报错‘找不到指定的模块’,但是我们可以在build/Release文件中找到addon.node文件,这是因为缺少的依赖是缺少的.dll。下载DependencyWalker,这个软件可以帮你判断缺少什么.dll,下载地址:http://www.dependencywalker.com/。我将addon.node文件添加到DependencyWalker中,发现gdal/bin中的.dll不见了。我把gdal/bin下的.dll文件复制到addon.node目录下,然后运行test.js文件就可以正常使用了。