cgo
cgo是用来在Go语言中调用C语言的工具
Go语言调用C语言
简单C语言函数
package main
/*
#include <stdio.h>
void sayHello() {
printf("%s\n", "hello world");
}
*/
import "C"
func main() {
C.sayHello()
}
hello world
在Go
语言中需要通过import "C"
关键字来链接gcc
编译器,在import "C"
前紧挨着的注释就是相关的代码
跨文件调用
//hello.c
#include <stdio.h>
void sayHello() {
printf("%s\n", "hello world");
}
package main
//void sayHello();
import "C"
func main() {
C.sayHello()
}
将hello.c
放在当前目录下即可,go
语言在构建时会自动编译当前目录下的c
文件;只需要额外添加一个函数声明即可
动态库调用
package main
//#cgo LDFLAGS: -L. -lhello
//void sayHello();
import "C"
func main() {
C.sayHello()
}
通过#cgo
即可指定编译需要的动态库路径、头文件路径等,使用LDFLAGS
、CFLAGS
等
注意
在实际使用中可能会遭遇到非常多的问题,比如引用类型、指针等问题;不能放弃c
语言的庞大遗产,但是也要尽量规避这种跨语言调用
从C语言中调用Go语言
package main
import "C"
import "fmt"
// export Go2C
func Go2C() {
fmt.Println("hello, C")
}
func main() {
}
go build -v -x -buildmode=c-shared -o libhello.so main.go
通过export
注释即可导出该函数,通过-buildmode=c-shared
即可编译出动态库给C语言调用;唯一需要注意的是必须要携带main
函数,哪怕为空