https://jermine.vdo.pub/go/golang%E4%B8%8Ec%E4%BA%92%E7%9B%B8%E8%B0%83%E7%94%A8%E4%BB%A5%E5%8F%8A%E8%B0%83%E7%94%A8c%E7%9A%84so%E5%8A%A8%E6%80%81%E5%BA%93%E5%92%8Ca%E9%9D%99%E6%80%81%E5%BA%93/
could not determine kind of name for C.foo

tree
.
├── sub
│ ├── foo.go
│ ├── foo.h
│ └── hello.c
└── test
├── main
└── main.go
root@ubuntu:~/go_c# tree
.
├── sub
│ ├── foo.go
│ ├── foo.h
│ └── hello.c
└── test
├── main
└── main.go
2 directories, 5 files
root@ubuntu:~/go_c# cat sub/foo.go
package sub
/*
#cgo CFLAGS: -Wall
extern void foo();
void __attribute__((constructor)) init(void) {
foo();
}
*/
import "C"
// AlwaysFalse is here to stay false
// (and be exported so the compiler doesn't optimize out its reference)
func init() {
C.init()
}
root@ubuntu:~/go_c# cat sub/hello.c
#include <stdio.h>
#include "foo.h"
int count = 6;
void foo(){
printf("I am foo!\n");
}root@ubuntu:~/go_c# cat sub/foo.h
int count;
void foo();root@ubuntu:~/go_c#
root@ubuntu:~/go_c# cat test/main.go
package main
import "fmt"
import "C"
import _ "../sub"
func init() {
fmt.Println("init in main.go ")
}
func main(){
fmt.Println("Hello c, welcome to go!")
}
root@ubuntu:~/go_c/test# ./main I am foo! I am foo! init in main.go Hello c, welcome to go! root@ubuntu:~/go_c/test#
package main
import "fmt"
//import "C"
//import _ "../sub"
func init() {
fmt.Println("init in main.go ")
}
func main(){
fmt.Println("Hello c, welcome to go!")
}
root@ubuntu:~/go_c/test# go build main.go root@ubuntu:~/go_c/test# ./main init in main.go Hello c, welcome to go! root@ubuntu:~/go_c/test#
root@ubuntu:~/go_c/test# cat ../sub/foo.go
package sub
/*
#cgo CFLAGS: -Wall
extern void foo();
void __attribute__((constructor)) init(void) {
foo();
}
*/
import "C"
var AlwaysFalse bool
// AlwaysFalse is here to stay false
// (and be exported so the compiler doesn't optimize out its reference)
func init() {
if AlwaysFalse {
C.init()
}
}
root@ubuntu:~/go_c/test# go build main.go # _/root/go_c/sub cgo-gcc-prolog: In function ‘_cgo_b2a0b4a5114f_Cfunc_init’: cgo-gcc-prolog:47:33: warning: unused variable ‘_cgo_a’ [-Wunused-variable] root@ubuntu:~/go_c/test# ./main I am foo! init in main.go Hello c, welcome to go!