Cannot access c variables in cgo

跟風遠走 提交于 2019-12-20 05:57:59

问题


I'm trying to access a c struct in cgo, but go this

could not determine kind of name for C.utmpx

utmpx is a c struct

here is the go code:

/*
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>
*/
import "C"

type record C.utmpx

fd, err := os.Open(C._PATH_UTMPX) // this works
fd, err := os.Open(C.UTMPX_FILE)  // error

In the utmpx.h file , there is

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

I can use _PATH_UTMPX but get the same warn when using UTMPX_FILE, why?

It seems that I cannot access these variables declared in .h file How can i do this ?

platform: macOS sirria,go 1.8


回答1:


#define's are problematic with CGo. I could get it to work with Go 1.8.1 on Linux amd64 like this:

package main

import "os"

/*
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>

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. I had to define _GNU_SOURCE to get the UTMPX_FILE definition.
  2. I had to create the path_utmpx variable to get around the #define problems with CGo.
  3. I had to do the typedef to get type record C.utmpx compile.
  4. With Go, you can't use C strings directly. You must convert them to Go strings. Similarly, if you want to call C functions with Go strings, you must convert them to C strings (and free the space allocated in the heap).

A few pointers:

  • https://blog.golang.org/c-go-cgo
  • https://golang.org/cmd/cgo/

Good luck!



来源:https://stackoverflow.com/questions/44036358/cannot-access-c-variables-in-cgo

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!