No se puede acceder a las variables c en cgo

Estoy tratando de acceder a la estructura en cgo, pero ve esto

No se pudo determinar el tipo de nombre para C.utmpx

utmpx es una estructura de ac

Aquí está el código go:

/* #include  #include  #include  #include  #include  */ import "C" type record C.utmpx fd, err := os.Open(C._PATH_UTMPX) // this works fd, err := os.Open(C.UTMPX_FILE) // error 

En el archivo utmpx.h, hay

  #define _PATH_UTMPX "/var/run/utmpx" #define UTMPX_FILE _PATH_UTMPX 

Puedo usar _PATH_UTMPX, pero recibir la misma advertencia al usar UTMPX_FILE, ¿por qué?

Parece que no puedo acceder a estas variables declaradas en el archivo .h ¿Cómo puedo hacer esto?

Plataforma: macOS sirria, pasa 1.8.

# Definir son problemáticos con CGo. Podría hacerlo funcionar con Go 1.8.1 en Linux amd64 de esta manera:

 package main import "os" /* #define _GNU_SOURCE 1 #include  #include  #include  #include  #include  char *path_utmpx = UTMPX_FILE; typedef struct utmpx utmpx; */ import "C" type record C.utmpx func main() { path := C.GoString(C.path_utmpx) fd, err := os.Open(path) if err != nil { panic("bad") } fd.Close() } 
  1. Tuve que definir _GNU_SOURCE para obtener la definición de UTMPX_FILE.
  2. Tuve que crear la variable path_utmpx para sortear los problemas #define con CGo.
  3. Tuve que hacer el typedef para obtener el type record C.utmpx compile.
  4. Con Go, no puedes usar las cadenas C directamente. Debes convertirlos a cuerdas Go. De manera similar, si desea llamar a las funciones C con cadenas Go, debe convertirlas en cadenas C (y liberar el espacio asignado en el montón).

Algunos punteros:

¡Buena suerte!