Сделал. Но при вызове из C, вот что получается:
bash: ./a.out: cannot execute binary file: Exec format error
Пример
ferret.go:
package main
import "C"
import (
"math/rand"
"time"
)
//export cgoCurrentMillis
func cgoCurrentMillis() C.long {
return C.long(time.Now().Unix())
}
//export cgoSeed
func cgoSeed(m C.long) {
rand.Seed(int64(m))
}
//export cgoRandom
func cgoRandom(m C.int) C.int {
return C.int(rand.Intn(int(m)))
}
func main() {
}
Кладу рядом ferret.h:
extern long int cgoCurrentMillis();
extern void cgoSeed(long int m);
extern int cgoRandom(int m);
Далее делаю так:
go build -buildmode c-shared -o ferret.so .
Затем создаю файлик:
#include <stdio.h>
#include <ferret.h>
int main(void) {
cgoSeed(cgoCurrentMillis());
printf("Hello World from C!\n");
// printf("cgoRandom() -> %d\n", cgoRandom(256));
return 0;
}
Теперь:
gcc -c -I. -L./ferret.so -o a.out main.c
Дальше:
chmod 777 a.out
./a.out
На что получаю:
bash: ./a.out: cannot execute binary file: Exec format error
Как решить проблему?
-с собирает объектный файл в не исполняемый
/tmp/ccteoTFy.o: In function `main': main.c:(.text+0xa): undefined reference to `cgoCurrentMillis' main.c:(.text+0x12): undefined reference to `cgoSeed' main.c:(.text+0x28): undefined reference to `cgoRandom' collect2: error: ld returned 1 exit status
Обсуждают сегодня