无法访问cgo中的c变量

时间:2017-05-17 23:38:47

标签: c go cgo

我试图在cgo中访问c结构,但是这个

  

无法确定C.utmpx的名称

utmpx是一个c struct

这是go代码:

/*
#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

在utmpx.h文件中,有

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

我可以使用_PATH_UTMPX,但在使用UTMPX_FILE时会收到相同的警告,为什么?

似乎我无法访问.h文件中声明的这些变量 我怎么能这样做?

平台:macOS sirria,去1.8

1 个答案:

答案 0 :(得分:1)

#define对CGo有问题。我可以在Linux amd64上使用Go 1.8.1,就像这样:

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. 我必须定义_GNU_SOURCE才能获得UTMPX_FILE定义。
  2. 我必须创建path_utmpx变量以解决CGo的#define问题。
  3. 我必须使用typedef来type record C.utmpx编译。
  4. 使用Go,您无法直接使用C字符串。您必须将它们转换为Go字符串。同样,如果要使用Go字符串调用C函数,则必须将它们转换为C字符串(并释放堆中分配的空间)。
  5. 一些指示:

    祝你好运!