Hi Ian, I tried to merge both go files as you suggested and it is showing same error as the previous one. Following is the code. Also, I would like to mention that I am using Go1.15 linux/amd64.
*$CGO_ENABLED=1 go build .* *# _/home/ami.ladani/Downloads/experiment./main.go:22:44: baz_ptr.b undefined (type *GoBaz has no field or method b)./main.go:23:44: baz_ptr.f undefined (type *GoBaz has no field or method f)* // c_header.h typedef void (*cb)(void* qux, int status, void *command_data, void *cb_data); typedef struct{ int a; int b; } Foo; typedef struct{ char* ch; cb callback; } Bar; typedef struct{ Foo* f; Bar* b; } Baz; Baz* allocateBaz(){ Baz* baz = malloc(sizeof(Baz)); Bar* bar = malloc(sizeof(Bar)); Foo* foo = malloc(sizeof(Foo)); baz->f = foo; baz->b = bar; return baz; } //main.go package main /* #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include "c_header.h" */ import "C" import "unsafe" type GoBaz C.struct_Baz type GoBar C.struct_Bar type GoFoo C.struct_Foo func main() { baz_ptr := (*GoBaz)(unsafe.Pointer(C.allocateBaz())) bar_ptr := (*GoBar)(unsafe.Pointer(baz_ptr.b)) foo_ptr := (*GoFoo)(unsafe.Pointer(baz_ptr.f)) } Thanks! Ami On Friday, July 23, 2021 at 3:43:19 AM UTC+5:30 Ian Lance Taylor wrote: > On Thu, Jul 22, 2021 at 2:53 PM Ami Ladani <amila...@gmail.com> wrote: > > > > I am trying to access members of a C struct from go. Compiler is showing > structure's members are undefined. I have attached my code and the error > message below. > > > > Please have a look and help if you can. > > > > $CGO_ENABLED=1 go run main.go cfuncs.go > > # command-line-arguments > > ./main.go:18:44: baz_ptr.b undefined (type *GoBaz has no field or method > b) > > ./main.go:19:44: baz_ptr.f undefined (type *GoBaz has no field or method > f) > > > > //c_header.h > > typedef void (*cb)(void* qux, int status, void *command_data, void > *cb_data); > > typedef struct{ > > int a; > > int b; > > } Foo; > > > > typedef struct{ > > char* ch; > > cb callback; > > } Bar; > > > > typedef struct{ > > Foo* f; > > Bar* b; > > } Baz; > > //-------------------------------- > > > > //cfuncs.go > > package main > > /* > > #include<c_header.h> > > #include <stdlib.h> > > > > Baz* allocateBaz(){ > > Baz* baz = malloc(sizeof(Baz)); > > Bar* bar = malloc(sizeof(Bar)); > > Foo* foo = malloc(sizeof(Foo)); > > baz->f = foo; > > baz->b = bar; > > return baz; > > } > > */ > > import "C" > > //------------------------------------------------- > > > > //main.go > > package main/* > > #include<c_header.h> > > extern Baz* allocateBaz(); > > */ > > import "C" > > import "unsafe" > > type GoBaz C.struct_Baz > > type GoBar C.struct_Bar > > type GoFoo C.struct_Foo > > func main() { > > baz_ptr := (*GoBaz)(unsafe.Pointer(C.allocateBaz())) > > bar_ptr := (*GoBar)(unsafe.Pointer(baz_ptr.b)) > > foo_ptr := (*GoFoo)(unsafe.Pointer(foo_ptr.f)) > > } > > //-------------------------------- > > > Interesting. I think that has to do with the fact that you are using > two different Go files that both #include <c_header.h>. <c_header.h> > uses typedef to define anonymous structs. The fact that the header is > being included twice in the same package seems to be causing cgo to > generate two different Go structs, one for each .go file. And then it > can't figure out the definition of the Go struct, so you get this > error. > > This is probably a bug in cgo, so feel free to file an issue at > https://golang.org/issue. > > You can probably make progress by combining the .go files so that you > only have a single import "C" with a #include <c_header.h>. > > Ian > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/b3233044-7f3a-46c6-8d59-58a7f1835109n%40googlegroups.com.