无法访问cgo中的c变量

Cannot access c variables in cgo

我正在尝试访问 cgo 中的 c 结构,但是请执行此操作

could not determine kind of name for C.utmpx

utmpx 是一个 c 结构

这是执行代码:

/*
#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,go 1.8

#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 字符串(并释放堆中分配的 space )。

一些提示:

祝你好运!