无法访问CGO中的C变量

我正在尝试在cgo中访问ac struct,但是要这样做

无法确定C.utmpx的名称种类

utmpx是结构

这是执行代码:

/*

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

一些提示:

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

祝好运!

以上是 无法访问CGO中的C变量 的全部内容, 来源链接: utcz.com/qa/402607.html

回到顶部