Сделал. Но при вызове из 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
Обсуждают сегодня