【问题标题】:How to include tesseract library in node-gyp build process如何在 node-gyp 构建过程中包含 tesseract 库
【发布时间】:2018-05-22 04:01:28
【问题描述】:

我正在尝试使用 tesseract 库作为依赖项创建简单的节点插件,但我是 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

我想通过一个命令构建我的节点插件和所有依赖项(如 tesseract)。并且不知道如何在node-gyp build中链接c++依赖

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

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

如果有其他简单的方法可以做到这一点,请分享。

【问题讨论】:

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


    【解决方案1】:

    我会自己回答我的问题。

    我找到了一个项目:https://github.com/cmake-js/cmake-js,其中有很多关于为什么要离开 gyp 的解释:

    ...首先,gyp 平台的创建者 Google 正在转向其名为 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
    

    祝你好运!

    【讨论】:

    • & 这是为你构建一个 .node 吗?添加所有 c++ 源代码并为 node.js 创建一个独立的可执行文件应该很酷
    【解决方案2】:

    我想要它!

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

    可以一起合作!

    【讨论】:

    • 我找到了解决方案,看看接受的答案。
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2015-06-28
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多