代码之家  ›  专栏  ›  技术社区  ›  q-nick

如何在节点gyp构建过程中包括tesseract库

  •  2
  • q-nick  · 技术社区  · 7 年前

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

    结合复写的副本:

    #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)
    

    结合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/

    不幸的是,我不知道如何将其与节点gyp构建过程联系起来。CPPAN有一个配置文件,名为CPPAN。yml(类似于npm中的package.json)

    cppan。yml:

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

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

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

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

    如果有其他简单的方法来实现这一点,请与我们分享。

    2 回复  |  直到 7 年前
        1
  •  0
  •   nodeover    7 年前

    我想要它!

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

    在这个问题上,我们可以合作!

        2
  •  0
  •   q-nick    7 年前

    我会自己回答我的问题。

    我发现了一个项目: https://github.com/cmake-js/cmake-js 这有很多关于为什么离开gyp的解释:

    ...首先,谷歌,gyp平台的创造者,正在向其新的构建系统gn迈进,这意味着gyp的支持天数已经计算在内。。。

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

    ...本项目的目标是存储开发本机节点所需的所有逻辑。js插件无需检查NODE\u MODULE\u版本并陷入宏混乱。。。

    所以我尝试一下。

    结合复写的副本:

    #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
    

    现在,一切都已经准备好了,我们可以运行了 install build 命令:

    cppan
    

    cmake-js build
    

    祝你好运