在Go中结束OpenJtalk,成功包含了文件,并且引用类型没有问题,但是函数触发undefined reference错误。
undefined reference
jtalk.go:
package main // #cgo CFLAGS: -I/home/vagrant/open_jtalk/njd [...etc] /* #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <math.h> // Main headers #include "mecab.h" #include "njd.h" #include "jpcommon.h" #include "HTS_engine.h" // Sub headers #include "text2mecab.h" #include "mecab2njd.h" #include "njd_set_pronunciation.h" #include "njd_set_digit.h" #include "njd_set_accent_phrase.h" #include "njd_set_accent_type.h" #include "njd_set_unvoiced_vowel.h" #include "njd_set_long_vowel.h" #include "njd2jpcommon.h" */ import "C" type Open_JTalk struct { mecab C.Mecab each of these struct references are fine njd C.NJD jpcommon C.JPCommon engine C.HTS_Engine } func (open_jtalk *Open_JTalk) Open_JTalk_initialize() { C.Mecab_initialize(&open_jtalk.mecab) // when any function is called the error happens C.NJD_initialize(&open_jtalk.njd) C.JPCommon_initialize(&open_jtalk.jpcommon) C.HTS_Engine_initialize(&open_jtalk.engine) } func main() { }
而且奇怪的是,这些相同的函数在类型之后声明:
mecab.h
// line 1584 typedef struct _Mecab{ char **feature; int size; mecab_t *mecab; } Mecab; BOOL Mecab_initialize(Mecab *m);
项目网页:http : //open- jtalk.sourceforge.net/
您需要添加cgo链接器选项(LDFLAGS)以及库的路径和名称。例如
LDFLAGS
// #cgo CFLAGS: -Iyour-include-path // #cgo LDFLAGS: -Lyour-library-path -lyour-library-name-minus-the-lib-part