2015-04-03 83 views
0

在Go中包含OpenJtalk,文件已成功包含,并且引用的类型没有问题,但功能会触发undefined reference错误。包含文件中的CGO未定义参考

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/

回答

6

您需要添加cgo链接器选项(LDFLAGS)以及你的图书馆的路径和名称。例如

// #cgo CFLAGS: -Iyour-include-path 
// #cgo LDFLAGS: -Lyour-library-path -lyour-library-name-minus-the-lib-part 
+1

Alternaively(如果有的话):'// #cgo pkg配置:onelib anotherlib' – jimt 2015-04-03 20:49:23

+0

这适用于所有减去'-L /家庭/流浪者/ open_jtalk /仲裁处/ src目录-llibmecab':**/usr/bin/ld:找不到-llibmecab **。 而且我在该文件夹和'/ usr/local/lib /'中都有** libmecab **,包括静态和动态。 – localhost 2015-04-03 21:13:12

+0

-lmecab(删除lib)? – 2015-04-03 21:19:11