亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 260 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號