如何在node-gyp构建过程中包含tesseract库

时间:2017-12-07 23:09:15

标签: javascript c++ node.js node-gyp

我正在尝试用tesseract库创建简单的node-addon作为依赖项,但我是一个c ++初学者。 整个代码位于:https://github.com/q-nick/node-tesseract

binding.cc:

#include <node.h>
#include <v8.h>
// #include <tesseract/baseapi.h>
// #include <leptonica/allheaders.h>

void Method(const v8::FunctionCallbackInfo<v8::Value>& args) {
  v8::Isolate* isolate = args.GetIsolate();
  args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "world"));
}

void init(v8::Local<v8::Object> exports) {
  NODE_SET_METHOD(exports, "hello", Method);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, init)

binding.gyp:

{
  "targets": [
    {
      "target_name": "binding",
      "sources": [
        "src/binding.cc"
      ],
      'defines': [ 'V8_DEPRECATION_WARNINGS=1' ],
      'include_dirs': [
      ],
      'libraries': [
        # '-lpvt.cppan.demo.google.tesseract.libtesseract',
        # '-lleptonica'
      ]
    }
  ]
}

我找到了一个项目,可以帮助我编译像tesseract,leptonica这样的依赖项 - 它是https://cppan.org/

不幸的是,我无法弄清楚 - 如何将其与node-gyp构建过程联系起来。 CPPAN有一个名为cppan.yml的配置文件(类似于npm中的package.json)

cppan.yml:

dependencies:
  pvt.cppan.demo.google.tesseract.libtesseract: master
  pvt.cppan.demo.danbloomberg.leptonica: 1

我想通过一个命令构建我的node-addon和所有依赖项(如tesseract)。并且不知道如何在node-gyp build

中链接c ++依赖项

我想使用最新的tesseract版本,所以我不能使用预编译的库。目前,我在Windows环境中工作,但我希望它是一个跨平台的过程。

我的示例GitHub项目(https://github.com/q-nick/node-tesseract)必须在取消注释tesseract include后成功编译。

如果有其他简单方法如何完成此请分享。

2 个答案:

答案 0 :(得分:0)

我想要它!

解决方案是将所有c ++ tesseract代码构建为依赖项! (和leptonica),所以第一个是尝试知道如何构建tesseract(哪些参数,变量,定义......) 只需检查一下,例如:https://github.com/istex/popplonode/blob/master/binding.gyp lib文件夹中有一个依赖文件到poppler。

可以在这上面合作!

答案 1 :(得分:0)

我会自己回答我的问题。

我找到了一个项目:https://github.com/cmake-js/cmake-js,它解释了为什么要离开gyp:

  

...首先,谷歌,gyp平台的创建者正在朝着名为gn的新构建系统发展,这意味着gyp的支持天数将被计算在内......

我还发现:https://github.com/nodejs/nan/

  

...这个项目的目标是存储开发本机Node.js插件所需的所有逻辑,而不必检查NODE_MODULE_VERSION并让自己陷入宏观纠结......

所以我试一试。

binding.cc:

#include <nan.h>
#include <baseapi.h>
#include <allheaders.h>

NAN_MODULE_INIT(InitAll) {
  Set(target, New<String>("myMethod").ToLocalChecked(),
    GetFunction(New<FunctionTemplate>(MyMethod)).ToLocalChecked());
}

NODE_MODULE(addon, InitAll)

NAN_METHOD(MyMethod) {
  info.GetReturnValue().Set(Nan::New<v8::String>("world").ToLocalChecked());
}

接下来是创建CMakeLists.txt文件,几乎没有修改。我想使用cppan作为依赖项安装程序,所以我必须在默认的CMAkeLists.txt文件中添加一些额外的行:

add_subdirectory(.cppan)
...
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB}
    pvt.cppan.demo.google.tesseract.libtesseract
    pvt.cppan.demo.danbloomberg.leptonica
)

的CMakeLists.txt:

project(addon)

file(GLOB SOURCE_FILES "src/**/*.cc" "src/**/*.h")
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})

add_subdirectory(.cppan)

set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC})

target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB}
    pvt.cppan.demo.google.tesseract.libtesseract
    pvt.cppan.demo.danbloomberg.leptonica
)

cppan.yml

dependencies:
  pvt.cppan.demo.google.tesseract.libtesseract: master
  pvt.cppan.demo.danbloomberg.leptonica: 1

现在,所有内容都已设置完毕,我们可以运行installbuild命令:

cppan

cmake-js build
祝你好运!