I would like to use the Japanese morpheme analyzer "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
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
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()
And I executed the following command.
nim cpp main.nim
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
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.