如何将Lua与Mecab绑定?

如何将Lua与Mecab绑定?,lua,bind,swig,mecab,Lua,Bind,Swig,Mecab,我想在Lua中使用,但我真的搞不清楚绑定的过程,我没有windows 7,bingdings的意思是创建一个共享库吗?若有??怎么做?我看到一些关于Java的绑定文件,包org.chasen.mecab中的文件显示它是由swig创建的,这让我很困惑。那么它是从哪里派生的呢?或者我们自己写?绑定后,如果我想在Lua中使用mingw,我还应该做什么?有人能给我一些简单的步骤,让我继续努力工作吗 致greatwolf: 我使用以下命令来做这件事 swig -lua -c++ MeCab.i g++

我想在Lua中使用,但我真的搞不清楚绑定的过程,我没有windows 7,bingdings的意思是创建一个共享库吗?若有??怎么做?我看到一些关于Java的绑定文件,包org.chasen.mecab中的文件显示它是由swig创建的,这让我很困惑。那么它是从哪里派生的呢?或者我们自己写?绑定后,如果我想在Lua中使用mingw,我还应该做什么?有人能给我一些简单的步骤,让我继续努力工作吗

致greatwolf: 我使用以下命令来做这件事

swig -lua  -c++ MeCab.i
g++ -c MeCab_wrap.cxx -I C:\Lua\5.1\include -I ..\src
g++ -LC:\Lua\5.1\lib -shared MeCab_wrap.o -llua51  -o MeCab.dll
下面是我的错误

 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2960): undefined reference to `_imp___ZN5MeCab12createTaggerEPKc'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2981): undefined reference to `_imp___ZN5MeCab12getLastErrorEv'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x29c9): undefined reference to `_imp___ZN5MeCab12createTaggerEPKc'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x29d9): undefined reference to `_imp___ZN5MeCab12getLastErrorEv'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2a8d): undefined reference to `_imp___ZN5MeCab11createModelEPKc'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2aae): undefined reference to `_imp___ZN5MeCab12getLastErrorEv'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2af6): undefined reference to `_imp___ZN5MeCab11createModelEPKc'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2b06): undefined reference to `_imp___ZN5MeCab12getLastErrorEv'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x2b6d): undefined reference to `_imp___ZN5MeCab13createLatticeEv'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x11050): undefined reference to `MeCab::Model::version()'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x11457): undefined reference to `MeCab::Model::create(int, char**)'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x11732): undefined reference to `MeCab::Model::create(char const*)'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x122bf): undefined reference to `MeCab::Tagger::parse(MeCab::Model const&, MeCab::Lattice*)'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x17737): undefined reference to `MeCab::Tagger::create(int, char**)'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x17a12): undefined reference to `MeCab::Tagger::create(char const*)'
 MeCab_wrap.o:MeCab_wrap.cxx:(.text+0x17d83): undefined reference to `MeCab::Tagger::version()'
 collect2: ld returned 1 exit status

这些函数似乎是在mecab.h中声明的,但我不知道如何处理它。

我不知道mecab有任何Lua绑定。先用谷歌搜索一下

要自己创建绑定,您必须精通和C(或C++)。深入理解Lua本身(我的意思是语言)是明智的


搜索更多的指针。特别是页面。

看起来mecab为自动生成的绑定提供了一种新的方法。幸运的是,lua是swig支持的目标之一

一个合理的起点是检查相应的makefile,以了解如何为其他语言创建绑定。发件人:

根据以上推断,您可以尝试生成swig绑定,如下所示:

swig -lua -shadow -c++ MeCab.i

这将大大减少您自己手动创建绑定所需的工作量。

我最近需要它,因为我没有找到任何东西,所以我编写了一个可以将Mecab与Lua一起使用的工具

它的工作原理如下:

mecab = require "mecab" 
parser = mecab:new("") -- you can pass mecab config options here, like "-Owakati"

print(parser:parse("吾輩は猫である"))
您也可以通过Luarock将其安装为
mecab


它只提供了对
Tagger
类的
parse
方法的访问,但在使用Mecab时,这就是我所需要的。如果您希望支持其他Mecab功能,请随时在Github上提交一个问题。

它只是生成一个名为***_wrap.cxx的文件,我仍然无法找出使Mecab在lua上工作的明确步骤。@user2666334您需要做的是生成绑定(Mecab.I->swig->Mecab_wrap.cxx)并用mingw编译生成的绑定(MeCab_wrap.cxx->mingw->MeCab.dll)。我正在尝试(MeCab_wrap.cxx->mingw->MeCab.dll)我尝试了很多,但仍然不知道需要包含哪些文件,需要链接哪些库。使用g++制作,对吗?cmd告诉我类似于MeCab::Tagger::create(int,char**)“我看到了,它说了一些关于接口的事情,我应该写一些文件吗?@user2666334请添加您的问题的位置和方式。注释不是放置这些信息的好地方。在您的MeCab安装目录中,有一个包含
libmecab.dll
的“bin”和一个包含导入库“libmecab.lib”的“sdk”。您可以试试lin。”国王反对其中之一,但不确定它会工作。显然,提供的二进制文件是用MSVC构建的,所以被损坏的符号可能不会与明文一起使用。你可能需要使用MIW从源重建MeCAB。我也犯同样的错误,重建是我的另一个大问题。这是C++ C++的问题。用一个C++工具链构建的二进制文件“由于中的差异,无法与其他方法一起工作。此时,您有两种选择:使用mingw从源代码重新构建mecab并将绑定链接到该mecab,或者安装msvc并使用msvc编译mecab lua绑定。就我个人而言,我更喜欢前一种方法,因为您已经准备好了mingw安装程序,而后一种方法需要安装。”额外安装了几百兆的软件--visual studio并不是一个轻量级的安装。经过长时间的思考,我仍然不知道如何在Windows中构建MeCab。你能给我一些提示吗?我只是不知道从哪里开始。
mecab = require "mecab" 
parser = mecab:new("") -- you can pass mecab config options here, like "-Owakati"

print(parser:parse("吾輩は猫である"))