为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
肥皂起泡泡 2021-12-07 19:33:58
我试图学习和理解 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我在这里做错了什么?
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

在添加像 ldap 这样的库的个别特性之前,我会先了解 Go 和 cgo 的基础知识。一些好的起点,尤其是官方的 cgo 文档页面。


https://golang.org/cmd/cgo/

http://blog.golang.org/c-go-cgo

https://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。


    url := C.CString(os.Args[1])

    defer C.free(unsafe.Pointer(url))

Go 的int大小因架构而异,并且不是 C 的int类型。ldap_port在您的示例中被转换为默认类型int,您将需要C.int.


最后,您问题中的原始错误与 Go 或 cgo 无关。该ldap_init函数已弃用,不设置不存在LDAP_DEPRECATED。您应该使用该ldap_initialize功能。这是一个编译的最小示例:


package main


import (

    "log"

    "unsafe"

)


/*

#include <stdlib.h>

#include <ldap.h>


#cgo LDFLAGS: -lldap -llber

*/

import "C"


func main() {

    url := C.CString("ldap://127.0.0.1:389/")

    defer C.free(unsafe.Pointer(url))


    var ldap *C.LDAP


    rv := C.ldap_initialize(&ldap, url)

    if rv != 0 {

        log.Fatalf("ldap_initialize() error %d", rv)

    }

    log.Println("initialized")

}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信