cgo

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函数,哪怕为空

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容