I would like to use the Japanese morpheme analyzer "MeCab"( 
[https://github.com/taku910/mecab](https://github.com/taku910/mecab) ) in the 
Nim language.

Since I use Windows 10, I thought about how to load the DLL in the Nim language 
and use the functions defined in the DLL.

However, an error occurs because the DLL maybe cannot be loaded.

On the Mac, I was able to run it in the following way.

It calls the libMeCab.dylib file.

[https://qiita.com/nunulk/items/da69b2cc8643fd8a7f8f](https://qiita.com/nunulk/items/da69b2cc8643fd8a7f8f)

I tried to edit this code for Windows.

**parser.nim**
    
    
    {.link: "libmecab.dll".}
    
    {.emit: """
    using namespace MeCab;
    """.}
    
    const header = "<MeCab.h>"
    
    type MeCabModelObj {.final, header: header, importcpp: "MeCab::Model".} = 
object
    type MeCabModel = ptr MeCabModelObj
    type MeCabTaggerObj {.final, header: header, importcpp: "MeCab::Tagger".} = 
object
    type MeCabTagger = ptr MeCabTaggerObj
    type MeCabLatticeObj {.final, header: header, importcpp: "MeCab::Lattice".} 
= object
    type MeCabLattice = ptr MeCabLatticeObj
    type ccstring {.importc:"const char*".} = object
    
    proc createModel(argv: cstring): MeCabModel {.header: header, importcpp: 
"createModel(@)".}
    proc createTagger(this: MeCabModel): MeCabTagger {.header: header, 
importcpp: "#.createTagger()".}
    proc createLattice(this: MeCabModel): MeCabLattice {.header: header, 
importcpp: "#.createLattice()".}
    proc setSentence(this: MeCabLattice, sentence: cstring): void {.header: 
header, importcpp: "#.set_sentence(@)".}
    proc parse(this: MeCabTagger, lattice: MeCabLattice): bool {.header: 
header, importcpp: "#.parse(@)".}
    proc toString(this: MeCabLattice): ccstring {.header: header, importcpp: 
"#.toString()".}
    
    type ParserObj = object
      tagger: MeCabTagger
      lattice: MeCabLattice
    
    type Parser* = ref ParserObj
    
    proc createParser*(): Parser =
      const option: cstring = ""
      
      let model = createModel(option)
      let tagger = createTagger(model)
      let lattice = createLattice(model)
      
      return Parser(tagger: tagger, lattice: lattice)
    
    proc parse*(parser: Parser, sentence: string): string =
      parser.lattice.setSentence(sentence)
      let ret = parser.tagger.parse(parser.lattice)
      if not ret:
        raise newException(ValueError, "failed to parse.")
      
      let str = cast[cstring](parser.lattice.toString())
      return $str
    
    
    Run

**main.nim**
    
    
    import os
    import parser
    
    proc main() =
      let arguments = commandLineParams()
      if arguments.len() < 1:
        echo "Input any text >"
        return
      
      let sentence = arguments[0]
      
      let parser = createParser()
      let str = parser.parse(sentence)
      
      echo str
    
    when isMainModule:
      main()
    
    
    Run

And I executed the following command.
    
    
    nim cpp main.nim
    
    
    Run

However, compiling C + + may fail or cause an error.
    
    
    parser.nim.cpp:(.text+0x119): undefined reference to 
`__imp__ZN5MeCab11createModelEPKc'
    collect2.exe: error: ld returned 1 exit status
    
    
    Run

What is the cause of this?

I think there is something wrong with how the DLL loads.

Please let me know the solution.

Thank you.

Reply via email to