2

cgo之调用静态库

 1 year ago
source link: https://blog.51cto.com/u_3764469/5716964
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

cgo之调用静态库

精选 原创

zzxiaoma 2022-09-27 16:30:02 博主文章分类:go ©著作权

文章标签 静态库 c语言 c++ 文章分类 Go语言 编程语言 yyds干货盘点 阅读数193

如果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))
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK