簡體   English   中英

cgo:在序言中使用typedef結構

[英]cgo: use typedef struct in preamble

我正在嘗試為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))

->無法確定C.free的名稱種類

轉到版本:轉到版本go1.4 linux / amd64(Windows上為Vagrant)

如果未定義某些內容,則無法確定could not determine kind of name for ...消息could not determine kind of name for ... 對於C.free ,將stdlib.h添加到您的include中。

#include <stdlib.h>

其他錯誤也是如此,只是這種情況是導入不正確的標頭或該標頭的錯誤版本的情況。 在隨機ubuntu系統上檢查時, lirc_client.h文件與您鏈接的文件有很大不同。 確保您使用的是定義了類型的正確版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM