1 回答
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")
}
- 1 回答
- 0 关注
- 223 浏览
添加回答
举报