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 關注
- 260 瀏覽
添加回答
舉報