在Go程序中使用C代码时未声明的标识符

时间:2014-10-10 22:41:08

标签: c go linker

我正在尝试使用从IRIS网站下载的库。 makefile包含用于创建动态和静态库的选项。我已经尝试了两个使用cgo的两种类型的库的教程,但我没有成功。

这是我的代码

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'

1 个答案:

答案 0 :(得分:1)

您的主要问题是评论不会紧挨import "C"作为the documentation推荐:

  

如果"C"的导入后面紧跟注释,则在编译包的C部分时,该注释(称为前导码)将用作标题。

因此,解决方案是删除注释和导入之间的空白行。但这不会编译,因为对于-l参数,忽略lib前缀。您必须指定-lslink而不是-llibslink。最后,我建议将库放在某个子文件夹中,而不是放在与.go文件相同的目录中。

使用适当的slink子文件夹的工作示例:

package main

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

func main() {
    C.sl_newslcd()
}