亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

node.js調(diào)用C++函數(shù)的方法示例

 更新時間:2018年09月21日 11:47:46   作者:Libre  
這篇文章主要介紹了node.js調(diào)用C++函數(shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

目前nodejs調(diào)用c++主流的有兩種方法,分別是addons和ffi

addons是nodejs官方的c++擴展實現(xiàn)方案,但是由于需要使用模版,并且要對v8引擎有一定的了解,入門門檻較高。

ffi是nodejs直接調(diào)用so庫的一種實現(xiàn),可以調(diào)用純c的接口。

要想node.js調(diào)用C++的函數(shù)等,須先將C++代碼編譯成二進(jìn)制的.node文件。node.js官方文檔https://nodejs.org/dist/latest-v8.x/docs/api/addons.html中的C++ addons介紹了如何將C++的代碼編譯為二進(jìn)制的.node文件。

一、步驟:

1.首先在項目目錄進(jìn)行npm install -g node-gyp下載node-gyp模塊,配置環(huán)境參考https://github.com/nodejs/node-gyp

2.這是node官方文檔中的例子

// addon.cc
#include <node.h>
namespace demo {
using v8::Exception;
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Value;// This is the implementation of the "add" method// Input arguments are passed using the// const FunctionCallbackInfo<Value>& args struct
void Add(const FunctionCallbackInfo<Value>& args) {
 Isolate* isolate = args.GetIsolate();
 // Check the number of arguments passed.
 if (args.Length() < 2) {
 // Throw an Error that is passed back to JavaScript
 isolate->ThrowException(Exception::TypeError(
  String::NewFromUtf8(isolate, "Wrong number of arguments")));
 return;
 }
 // Check the argument types
 if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
 isolate->ThrowException(Exception::TypeError(
  String::NewFromUtf8(isolate, "Wrong arguments")));
 return;
 }
 // Perform the operation
 double value = args[0]->NumberValue() + args[1]->NumberValue();
 Local<Number> num = Number::New(isolate, value);
 // Set the return value (using the passed in
 // FunctionCallbackInfo<Value>&)
 args.GetReturnValue().Set(num);}
void Init(Local<Object> exports) {
 NODE_SET_METHOD(exports, "add", Add);}NODE_MODULE(NODE_GYP_MODULE_NAME, Init)
} // namespace demo

3.然后在項目目錄下使用類似JSON的格式創(chuàng)建在項目頂層調(diào)用的文件binding.gyp文件,內(nèi)容為

{
 "targets": [
 {
  "target_name": "addon",
  "sources": [ "addon.cc" ]
 }
 ]
}

4.在終端輸入node-gyp configure命令生成一個build文件夾,然后輸入node-gyp build命令生成編譯addon.node文件

5.在node文件比如test.js文件中const addon=require(‘./build/Release/addon')調(diào)用生成的模塊

// test.js
const addon = require('./build/Release/addon');
console.log('This should be eight:', addon.add(3, 5));//結(jié)果為8

二、實例

最近公司讓我研究node調(diào)用C++,C++的代碼是調(diào)用了GDAL庫開發(fā)的功能。要在tile.cc文件中調(diào)用頭文件


這里#include調(diào)用的gdal_priv.h和ogrsf_frmts.h頭文件在gdal/include文件夾中,所以要在binding.gyp文件中source后面添加

 "include_dirs": [
  "./gdal/include"
  ],

然后如果現(xiàn)在就運行node-gyp configure build命令會報“無法解析的外部符號”的錯誤,這是因為還需要加入調(diào)用的鏈接庫,需要在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",
  ],
 }
 ]
}

這時再進(jìn)行node-gyp configure build命令就不會報錯生成addon.node文件,但是當(dāng)我運行test.js文件

const addon=require(‘./build/Release/addon')
var imagefile = "/vsicurl/http://sasmac.oss-cn-beijing.aliyuncs.com/cog.tif";
var x = 160;
var y = 83;
var l = 9;
console.log(addon.tileload(imagefile, x, y, l));

會報錯'找不到指定的模塊',但是我們在build/Release文件中能找到addon.node文件,這是因為缺少依賴也就是缺少.dll。下載 Dependency Walker,這個軟件可以幫你確定一下缺少什么.dll,下載地址:http://www.dependencywalker.com/。我將addon.node文件添加到Dependency Walker發(fā)現(xiàn)缺少gdal/bin中的.dll。我將gdal/bin中的.dll文件復(fù)制到addon.node目錄下,這時運行test.js文件就可以正常使用了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用nvm管理(切換)node版本詳細(xì)圖文教程

    使用nvm管理(切換)node版本詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于使用nvm管理(切換)node版本的相關(guān)資料,nvm是node.js的版本管理器,可以安裝和切換不同版本node.js,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Node.js筆記之process模塊解讀

    Node.js筆記之process模塊解讀

    這篇文章主要介紹了Node.js process模塊解讀,process存在于全局對象上,不需要使用require()加載即可使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 利用Node.js手寫一個簡單的koa

    利用Node.js手寫一個簡單的koa

    這篇文章主要為大家詳細(xì)介紹了如何手動寫一個簡單的koa,通過這個流程就可以較好的掌握koa2中的基本概念,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 關(guān)于Node.js中的JXcore打包示例

    關(guān)于Node.js中的JXcore打包示例

    這篇文章主要介紹了關(guān)于Node.js中的JXcore打包示例,JXcore 是一個支持多線程的 Node.js 發(fā)行版本,基本不需要對你現(xiàn)有的代碼做任何改動就可以直接線程安全地以多線程運行,需要的朋友可以參考下
    2023-05-05
  • 解析NodeJS異步I/O的實現(xiàn)

    解析NodeJS異步I/O的實現(xiàn)

    本篇文章主要介紹了解析NodeJS異步I/O的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Node.js中的模塊機制學(xué)習(xí)筆記

    Node.js中的模塊機制學(xué)習(xí)筆記

    這篇文章主要介紹了Node.js中的模塊機制學(xué)習(xí)筆記,本文講解了CommonJS模塊規(guī)范、Node模塊實現(xiàn)過程、模塊調(diào)用棧、包與NPM等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Nodejs調(diào)用Dll模塊的方法

    Nodejs調(diào)用Dll模塊的方法

    這篇文章主要介紹了Nodejs調(diào)用Dll模塊的方法,在文中給大家提到了nodejs通過ffi調(diào)用dll模塊的代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 在node中使用jwt簽發(fā)與驗證token的方法

    在node中使用jwt簽發(fā)與驗證token的方法

    這篇文章主要介紹了在node中使用jwt簽發(fā)與驗證token的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Node.js的HTTP模塊、URL模塊與supervisor工具介紹

    Node.js的HTTP模塊、URL模塊與supervisor工具介紹

    這篇文章介紹了Node.js的HTTP模塊、URL模塊與supervisor工具,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • node基于express框架操作Mysql數(shù)據(jù)庫的步驟

    node基于express框架操作Mysql數(shù)據(jù)庫的步驟

    這篇文章主要介紹了node基于express框架操作Mysql數(shù)據(jù)庫的步驟,文章給大家提到安裝mysql模塊和配置mysql模塊的步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論