2014-10-10 14 views
2

我正在嘗試使用從IRIS網站下載的庫。 makefile包含用於創建動態和靜態庫的選項。我已經嘗試了兩種使用cgo類型的庫的教程,但是我一直沒有成功。在Go程序中使用C代碼時未聲明的標識符

這裏是我的Go代碼

package main 
/* 
#cgo CFLAGS : -I . 
#cgo LDFLAGS: -L . -llibslink 
#include <libslink.h> 
*/ 

import (
    "C" 
) 

func main() { 

    C.sl_newslcd() 

} 

而且我在目錄中有下列文件:

ChangeLog   config.o   globmatch.o  logging.c   slplatform.c  strutils.c 
Makefile   doc    gswap.c   logging.o   slplatform.h  strutils.o 
Makefile.wat  example   gswap.o   main.go   slplatform.o  unpack.c 
Makefile.win  genutils.c   libslink.2.4.dylib msrecord.c   slutils.c   unpack.h 
README    genutils.o   libslink.a   msrecord.o   slutils.o   unpack.o 
README.md   globmatch.c  libslink.dylib  network.c   statefile.c 
config.c   globmatch.h  libslink.h   network.o   statefile.o 

我的錯誤消息的命令如下:go build -v main.go

command-line-arguments 
# command-line-arguments 
37: error: use of undeclared identifier 'SLCD' 
37: error: use of undeclared identifier 'sl_newslcd' 
+0

您是否嘗試過'去build',而不是'去建立-v main.go'?你知道cgo也會爲你編譯所有的C文件嗎? – fuz 2014-10-10 22:46:59

+0

我得到與上面相同的錯誤。 – kns 2014-10-11 00:42:35

回答

1

您的主要問題是該評論不是在之前作爲the documentation建議:

如果"C"進口立即被一個評論,該評論之前,被稱爲前同步碼,編譯程序包的C-部件時被用作首標。

所以解決方法是刪除評論和導入之間的空行。雖然這不會編譯,因爲-l參數lib前綴被忽略。您必須指定-lslink而不是-llibslink。最後,我建議將庫設置在某個子文件夾中,而不是與.go文件位於同一個目錄中。

工作實例與適當的子文件夾潛步:

package main 

// #cgo CFLAGS: -I libslink 
// #cgo LDFLAGS: -L libslink -lslink 
// #include <libslink.h> 
import "C" 

func main() { 
    C.sl_newslcd() 
} 
+0

非常感謝。這樣得到的一切建築,但是當我運行它,它吐出回: '使dyld:庫未加載:libslink.dylib' – kns 2014-10-11 15:31:38

+0

對不起,全部跟蹤: '使dyld:庫未加載:libslink.dylib 從引用:/ var/folders/b5/_j74l2td1fd_s1gp3xv6zdv00000gn/T/go-build345076158 /命令行參數/ _obj/exe /主 原因:圖像未找到 信號:跟蹤/ BPT陷阱# – kns 2014-10-11 15:37:21

+0

您動態鏈接。這意味着庫必須位於動態加載器搜索庫的位置。在'LD_LIBRARY_PATH'上查看['man dlopen'](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html)。對於你的例子,在運行之前設置'LD_LIBRARY_PATH = slink /'應該足夠了。 – nemo 2014-10-11 20:03:07

相關問題