cgo

2021-09-25  本文已影响0人  突击手平头哥

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即可指定编译需要的动态库路径、头文件路径等,使用LDFLAGSCFLAGS

注意

在实际使用中可能会遭遇到非常多的问题,比如引用类型、指针等问题;不能放弃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函数,哪怕为空

上一篇 下一篇

猜你喜欢

热点阅读