Я следую инструкциям:
Команда cgo
Если импорт "C" равен сразу с предшествующим комментарием, то
Комментарий, называемый преамбулой, используется в качестве заголовка при компиляции C
части пакета. Например:
// #include <stdio.h>
// #include <errno.h>
import "C"
или
/*
#include <stdio.h>
#include <errno.h>
*/
import "C"
Например,
gocbuf.go
package main
import (
"fmt"
"unsafe"
)
/*
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int printData(unsigned char *data) {
return printf("cData: %lu \"%s\"\n", (long unsigned int)strlen(data), data);
}
*/
import "C"
func main() {
// Allocate C data buffer.
width, height := 8, 2
lenData := width * height
// add string terminating null byte
cData := (*C.uchar)(C.calloc(C.size_t(lenData+1), C.sizeof_uchar))
// When no longer in use, free C allocations.
defer C.free(unsafe.Pointer(cData))
// Go slice reference to C data buffer,
// minus string terminating null byte
gData := (*[1 << 30]byte)(unsafe.Pointer(cData))[:lenData:lenData]
// Write and read cData via gData.
for i := range gData {
gData[i] = '.'
}
copy(gData[0:], "Data")
gData[len(gData)-1] = 'X'
fmt.Printf("gData: %d %q\n", len(gData), gData)
C.printData(cData)
}
Выход:
$ go run gocbuf.go
gData: 16 "Data...........X"
cData: 16 "Data...........X"
$
Ваша организация кода не имеет смысла для меня.
У вас должен быть пакет greeter
, который обернет C
функции через cgo
. Например,
src
└── greeter
├── greeter.c
├── greeter.go
└── greeter.h
со скелетными файлами
greeter.go
package greeter
/*
#include "greeter.h"
*/
import "C"
greeter.c
#include "greeter.h"
greeter.h
/* C header file */
Чтобы установить пакет greeter
, просто используйте go install
.
Не используйте относительные пути. Не используйте bash-скрипты.