我试图为lirc制作Go绑定: 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可能需要是一个指针,但我总是得到同样的错误。
然后我尝试了一个包装器,但是这给了我错误的未知类型名称' 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))
- &GT;无法确定C.free的名称
Go版本: 去版本go1.4 linux / amd64(Windows上的Vagrant)
答案 0 :(得分:4)
could not determine kind of name for ...
消息是您在未定义某些内容时获得的消息。如果是C.free
,请在您的包含中添加stdlib.h
。
#include <stdlib.h>
其他错误也是如此,除了这是导入错误标头或该标头的错误版本的情况。检查随机的ubuntu系统,lirc_client.h
文件与您链接的文件非常不同。确保您使用的是定义类型的正确版本。