教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 GO调用C函数

GO调用C函数

发布时间:2022-02-04   编辑:jiaochengji.com
教程集为您提供GO调用C函数等资源,欢迎您收藏本站,我们将为您提供最新的GO调用C函数资源
<h1>GO调用C函数</h1>

在很多场景下,在Go的程序中需要调用c函数或者是用c编写的库(底层驱动,算法等,不想用Go语言再去造一遍轮子,复用现有的c库)。我们在使用Golang开发项目或系统的时候难免会遇到Go和C语言混合编程,这时很多人都会选择使用cgo

<h2>直接引用C函数</h2><h3>Go代码直接调用c函数</h3><pre><code class="lang-golang">package main import "fmt" /* #include <stdio.h> void funcC(int a) { printf("recv num is %d \n", a); } */ import "C" func main() { var a C.int a = 100 C.funcC(a) fmt.Println("Test OK") } </code></pre><h3>传递数组的场景</h3><pre><code class="lang-golang">package main /* #include <stdio.h> #include <string.h> void fill_array(char *s) { strcpy(s, "cobbliu"); } void fill_2d_array(char **arr, int colSize) { strcpy((char*)(arr 0 * sizeof(char) * colSize), "hello"); strcpy((char*)(arr 1 * sizeof(char) * colSize/sizeof(char*)), "cgo"); } */ import "C" // 注意这个地方与上面注释的地方不能有空行,并且不能使用括号如import ("C" "fmt") import "fmt" import "unsafe" func main() { var dir [10]byte C.fill_array((*C.char)(unsafe.Pointer(&dir[0]))) fmt.Println(string(dir[:])) //var dirs [4][16]byte dirs := make([][]byte, 4) for i := 0; i < 4; i { dirs[i] = make([]byte, 16) } C.fill_2d_array((**C.char)(unsafe.Pointer(&dirs[0][0])), C.int(16)) fmt.Println(dirs) } </code></pre><h2>调用so中的c函数</h2><ul><li>编译一个so</li></ul><pre><code class="lang-c">//源文件test.c #include <stdio.h> void funcC() { printf("recv num is %d \n", a); } //头文件test.h void funcC(int a) //编译成动态库.so gcc -c -fPIC -o test.o test.c gcc -shared -o libtest.so test.o //也可以直接生成so gcc -fPIC -shared -o libtest.so test.c </code></pre><ul><li>go文件</li></ul><pre><code class="lang-golang">package main import "fmt" /* #cgo CFLAGS: -I./ #cgo LDFLAGS: -L./ -lhi #include "hi.h" //非标准c头文件,所以用引号 */ import "C" func main() { C.hi() fmt.Println("Test ok") } </code></pre><ul><li>CFLAGS中的-I(大写的i) 参数表示.h头文件所在的路径</li><li>LDFLAGS中的-L(大写) 表示.so文件所在的路径 -l(小写的L) 表示指定该路径下的库名称</li><li>直接运行go run main.go</li><li>如果引用不*.so, 将存入so的路径添加到环境变量当中: export LD_LIBRARY_PATH=/xxx/lib</li><li>也可以在 go build 的时候指定so的路径: go build -ldflags="-r ./" test.go。编译时指定连接目录</li></ul><h2>使用pkg-config进行so的管理</h2><h2>GO调C基本原理</h2>

cgo

到此这篇关于“GO调用C函数”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
GO调用C函数
go run main.go 参数_Go语言入门:Hello world
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
Go语言学习3----Go语言特色
Go语言发展历史、核心、特性及学习路线
go test 如何输出到控制台_深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发
理解 Golang 中函数调用的原理
[Go学习] 并发控制之WaitGroup计数信号量
Go的隐秘世界:从 Cgo 到 Goroutine 调度
golang 相互引用_cgo快速入门之golang调用C语言

[关闭]
~ ~