2015-04-03 3 views
0

Сжатие OpenJtalk в Go, файлы успешно включены и типы ссылаются без проблем, но функции запускают ошибку undefined reference.CGO undefined reference in included files

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 linker (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

+0

Это работает для всех минус' -L/дома/бродяга/open_jtalk/MeCab/ЦСИ -llibmecab': **/usr/bin/ld: не удается найти -llibmecab **. И у меня есть ** libmecab ** в этой папке и в '/ usr/local/lib /', как статические, так и динамические. – localhost

+0

Как насчет -lmecab (удалить lib)? –