cgo之调用静态库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgo之调用静态库相关的知识,希望对你有一定的参考价值。

如果CGO中引入的C/C++资源有代码而且代码规模也比较小,直接使用源码是最理想的方式,但很多时候我们并没有源代码,或者从C/C++源代码开始构建的过程异常复杂,这种时候使用C静态库也是一个不错的选择。静态库因为是静态链接,最终的目标程序并不会产生额外的运行时依赖,也不会出现动态库特有的跨运行时资源管理的错误。不过静态库对链接阶段会有一定要求:静态库一般包含了全部的代码,里面会有大量的符号,如果不同静态库之间出现了符号冲突则会导致链接的失败。

我们先用纯C语言构造一个简单的静态库。

我们要构造的静态库名叫add,库中只有一个add函数,用于表示数论中的模加法运算。add库的文件都在add目录下。

add/add.h头文件只有一个纯C语言风格的函数声明:

int add(int a, int b);
add/add.c 对应函数的实现:
#include "add.h"

int add(int a, int b)
return a+b;

因为CGO使用的是GCC命令来编译和链接C和Go桥接的代码。因此静态库也必须是GCC兼容的格式。

通过以下命令可以生成一个叫add.a的静态库:

$ cd ./add
$ gcc -c -o add.o add.c
$ ar rcs add.a add.o

生成add.a静态库之后,我们就可以在CGO中使用该资源了。

创建 main.go 文件如下:

package main

//#cgo CFLAGS: -I./add
//#cgo LDFLAGS: -L$SRCDIR/add -ladd
//
//#include "add.h"
import "C"
import "fmt"

func main()
fmt.Println(C.add(10, 5))

以上是关于cgo之调用静态库的主要内容,如果未能解决你的问题,请参考以下文章

CGO静态库和动态库

CGO静态库和动态库

深入学习CGO

深入学习CGO

如何在golang 中调用c的静态库或者动态库

cgo简单调用和引用动态库