Go cgo ldap_init could not determine kind of name for C.ldap_init -
i trying learn , understand cgo. writing program in go connect ad , parse output. tested code in c, working fine expected. relevant part in c is
char *ldap_host = "x.x.x.x"; int ldap_port = 389; ldap = ldap_init(ldap_host, ldap_port)) now trying same working in go as
//#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) } but getting following error
could not determine kind of name c.ldap_init what doing wrong here?
i start getting basics of go , cgo working before adding individual peculiarities of library ldap. starting points, official cgo doc page.
starting top:
you don't need cflags here, need ldflags linker, , liblber run.
#cgo ldflags: -lldap -llber you can't pass pointer go string c *char, different types. strings in go aren't addressable @ all, compile error if build process got far. use c.cstring, , c.free if need create c strings. need include stdlib.h c.free.
url := c.cstring(os.args[1]) defer c.free(unsafe.pointer(url)) go's int size varies architecture, , not c's int type. ldap_port in example converted default type of int, have needed c.int.
finally, original error in question has nothing go or cgo. ldap_init function deprecated, , not exist without setting ldap_deprecated. should use ldap_initialize function. here minimal example compiles:
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") }
Comments
Post a Comment