猿问

Go cgo ldap_init 无法确定 C.ldap_init 的名称类型

我试图学习和理解 cgo。我正在用 Go 编写一个程序,在其中连接到 AD 并解析输出。我在 C 中测试了代码,它按预期工作正常。中的相关部分C是


char *ldap_host = "x.x.x.x";

int   ldap_port     = 389;

ldap = ldap_init(ldap_host, ldap_port)) 

现在我试图在 go 中获得相同的工作


//#cgo CFLAGS: -lldap 

//#include <ldap.h>

import "C"

func main() {

    var hostname *string

    hostname = &os.Args[1]

    ldap_port := 389

    ldap := C.ldap_init(*hostname, ldap_port)

}

但我收到以下错误


could not determine kind of name for C.ldap_init

我在这里做错了什么?


肥皂起泡泡
浏览 224回答 1
1回答

慕桂英3389331

在添加像 ldap 这样的库的个别特性之前,我会先了解 Go 和 cgo 的基础知识。一些好的起点,尤其是官方的 cgo 文档页面。https://golang.org/cmd/cgo/http://blog.golang.org/c-go-cgohttps://github.com/golang/go/wiki/cgo从顶部开始:你不需要CFLAGS这里的,但你需要LDFLAGS链接器,并liblber运行它。#cgo LDFLAGS: -lldap -llber您不能将指向 Go 字符串的指针作为 C 传递*char,它们是不同的类型。Go 中的字符串实际上根本无法寻址,因此如果构建过程进行到那么远,这将是一个编译错误。如果需要创建 C 字符串C.CString,请使用, C.free。您还需要包括stdlib.hfor C.free。&nbsp; &nbsp; url := C.CString(os.Args[1])&nbsp; &nbsp; defer C.free(unsafe.Pointer(url))Go 的int大小因架构而异,并且不是 C 的int类型。ldap_port在您的示例中被转换为默认类型int,您将需要C.int.最后,您问题中的原始错误与 Go 或 cgo 无关。该ldap_init函数已弃用,不设置不存在LDAP_DEPRECATED。您应该使用该ldap_initialize功能。这是一个编译的最小示例:package mainimport (&nbsp; &nbsp; "log"&nbsp; &nbsp; "unsafe")/*#include <stdlib.h>#include <ldap.h>#cgo LDFLAGS: -lldap -llber*/import "C"func main() {&nbsp; &nbsp; url := C.CString("ldap://127.0.0.1:389/")&nbsp; &nbsp; defer C.free(unsafe.Pointer(url))&nbsp; &nbsp; var ldap *C.LDAP&nbsp; &nbsp; rv := C.ldap_initialize(&ldap, url)&nbsp; &nbsp; if rv != 0 {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatalf("ldap_initialize() error %d", rv)&nbsp; &nbsp; }&nbsp; &nbsp; log.Println("initialized")}
随时随地看视频慕课网APP

相关分类

Go
我要回答