【问题标题】:Cannot access c variables in cgo无法访问cgo中的c变量
【发布时间】:2017-05-18 13:12:59
【问题描述】:

我正在尝试访问 cgo 中的 c 结构,但是去这个

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

utmpx 是一个 c 结构体

这里是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,go 1.8

【问题讨论】:

  • 问题解决了吗?
  • @RicardoBranco 真的很抱歉耽搁了

标签: c go cgo


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

几点建议:

祝你好运!

【讨论】:

  • 很好的回答。对我来说,它在没有 #define _GNU_SOURCE 1 的情况下工作。 go 版本号为 1.8,os 为 macOS el capitan。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 2017-10-07
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2017-11-21
相关资源
最近更新 更多