我正在尝试访问 cgo 中的 c 结构,但是请执行以下操作
无法确定 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 sierra,至 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()
}
- 我必须定义 _GNU_SOURCE 才能获取 UTMPX_FILE 定义。
- 我必须创建 path_utmpx 变量来解决 CGo 的 #define 问题。
- 我必须做 typedef 才能得到
type record C.utmpx
编译。
- 在Go中,你不能直接使用C字符串。您必须将它们转换为 Go 字符串。同样,如果要使用 Go 字符串调用 C 函数,则必须将它们转换为 C 字符串(并释放堆中分配的空间)。
一些提示:
- https://blog.golang.org/c-go-cgo https://blog.golang.org/c-go-cgo
- https://golang.org/cmd/cgo/ https://golang.org/cmd/cgo/
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)