无法访问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()
}
- 我必须定义 _GNU_SOURCE 才能获得 UTMPX_FILE 定义。
- 我必须创建 path_utmpx 变量来解决 CGo 的 #define 问题。
- 我必须执行 typedef 才能
type record C.utmpx
编译。
- 在 Go 中,您不能直接使用 C 字符串。您必须将它们转换为 Go 字符串。同样,如果你想用 Go 字符串调用 C 函数,你必须将它们转换为 C 字符串(并释放堆中分配的 space )。
一些提示:
祝你好运!
我正在尝试访问 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()
}
- 我必须定义 _GNU_SOURCE 才能获得 UTMPX_FILE 定义。
- 我必须创建 path_utmpx 变量来解决 CGo 的 #define 问题。
- 我必须执行 typedef 才能
type record C.utmpx
编译。 - 在 Go 中,您不能直接使用 C 字符串。您必须将它们转换为 Go 字符串。同样,如果你想用 Go 字符串调用 C 函数,你必须将它们转换为 C 字符串(并释放堆中分配的 space )。
一些提示:
祝你好运!