CGO : use typedef struct in preamble

标签 c go lirc

我正在尝试为 lirc 创建 Go 绑定(bind): https://github.com/inando/go-lirc

像 lirc_init() 和 lirc_deinit() 这样的简单函数可以正常工作。

对于函数“lirc_command_init()”,我需要使用结构类型: https://github.com/inando/lirc/blob/master/lib/lirc_client.h#L334

typedef struct {
    char packet[PACKET_SIZE + 1];
    char buffer[PACKET_SIZE + 1];
    char reply[PACKET_SIZE + 1]; 
    int head;
    int reply_to_stdout;
    char* next;
} lirc_cmd_ctx;

我首先尝试了这样的事情:

func lircCommandInit(format string, v ...interface{}) (todoctx string, err error) {
    var ctx C.struct_lirc_cmd_ctx
    cmd := C.CString(fmt.Sprintf(format, v...))
    ok, err := C.lirc_command_init(ctx, cmd)
    fmt.Println(ok, err)
    return
}

但这给了我这个错误:无法确定 C.lirc_command_init 的名称类型。
不确定 struct_ 是否应该用于某个类型?
ctx 可能需要是一个指针,但我总是得到同样的错误。

然后我尝试使用包装器,但这给了我错误 unknown type name 'lirc_cmd_ctx'

// #cgo LDFLAGS: -llirc_client
// #cgo CFLAGS: -I /usr/include/lirc
// #include <lirc_client.h>
//
// int lirc_command_init_custom(const char* msg)
// {
//     lirc_cmd_ctx ctx;
//     return -2;
// }
import "C"

我在这里做错了什么?我如何在 Go 中使用该结构类型?

更新:
不确定这是否相关,但 C.free 也提示。

p := C.CString(prog)
defer C.free(unsafe.Pointer(p))

-> 无法确定 C.free 的名称类型

去版本: go version go1.4 linux/amd64 (Vagrant on windows)

最佳答案

could not determine kind of name for ... 消息是您在未定义某些内容时得到的消息。对于 C.free,将 stdlib.h 添加到您的包含中。

#include <stdlib.h>

其他错误也是如此,除了这是导入不正确的 header 或该 header 的错误版本的情况。检查一个随机的 ubuntu 系统,lirc_client.h 文件与您链接的文件有很大不同。确保您使用的是定义了类型的正确版本。

关于CGO : use typedef struct in preamble,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27688263/

相关文章:

cross-platform - 在 go/golang 中表示换行符的最便携/跨平台的方式是什么?

go - 如何从外部 gRPC 客户端连接到 k8s 集群内部的 gRPC 服务

linux - 找不到模式 2 命令

c++ - 将 C/C++ 代码从 Linux 转移到 Windows 真的很慢

c - 如何使用 microhttpd.h 在 C 中读取包含问号的 URL

c - 如何将全局变量或环境从主状态转移到 Lua channel ?

linux - 将 lirc 用于 ARM 皮质 A8

c - 为什么我的整个数组有 '\0' ?

Angular 和 Golang "No Access-Control-Allow-Origin is presents..."

time - 仅在一天中的特定时间使用 Cron 启动脚本