GO语言如何调用自己生成的so动态库文件

本文介绍了如何在Go语言中调用自动生成的SO动态库。首先讲解了SO动态库的生成步骤,包括创建C源文件、头文件,使用gcc编译为libname.so,并强调文件名需以lib开头。接着,阐述了Go语言通过cgo调用动态库的方法,以及在使用前修改LD_LIBRARY_PATH环境变量的必要性。最后,提到了直接调用C语言和Go语言全局变量的相关内容。
部署运行你感兴趣的模型镜像

一、调用so动态库;

1、so动态库文件的生成;

首先编写.c源文件和.h头文件;
使用gcc编译工具编译生成.so文件
gcc -shared source.c -o libname.so
或gcc -shared -fPIC source.c -o libname.so
-fPIC具体的意思需要查一下;
【注意】我在使用过程中,so动态文件的明明一定要注意,文件名一定要lib开头,libxxx.so,在之后导入时不需要加lib,如#cgo LDFLAGS: -L./ -lxxx即可;

2、go语言如何调用;

go语言想调用C语言的动态库,可通过cgo,具体用法如下:

package main
/*
#cgo CFLAGS: -I<path_of_header_file>
#cgo LDFLAGS: -L<path_of_so_file> -l<name_of_so>
#include "header_file"
*/
import "C"
    
func main(){
	C.function()
}

3、在使用前先更改路径LD_LIBRARY_PATH

linux系统下动态库也称共享库,自己生成的so文件可能也需要依赖第三方库,改变量就是告诉系统哪里可以找到需要的共享库;如果没有LD_LIBRARY_PATH,程序将无法找到,因此可以查看变量LD_LIBRARY_PATH的值,如果没有,需要手动添加:
export LD_LIBRARY_PATH=<path_of_so>:$(LD_LIBRARY_PATH)

4、demo

C语言源函数:

//happy.c
#include<stdio.h>
void sayhi(){
	printf("hello, world!\n");
	printf("bye-bye!\n");
}
int add(int a, int b){
	printf("%d+%d=%d", a, b, a+b);
	return a+b;
}

头文件

//happy.h
void sayhi();
int add(int, int);

生成so文件:

gcc -shared happy.c -o libhappy.so

go语言主函数

//main.go
package main
/*
#cgo CFLAGS: -I./
#cgo LDFLAGS: -L./ -lhappy
#include "happy.h"
*/
import "C"
import "fmt"

func main(){
a:=C.add(3, 4)
fmt.Println(a)
C.sayhi()
}

通过CFLAGS配置编译选项,
通过LDFLAGS来链接指定目录下的动态库。
import "C"是紧挨着注释的,没有空行。

export LD_LIBRARY_PATH = ./:$LD_LIBRARY_PATH

go run main.go

**

二、直接调用c语言;

**

//main.go
package main
/*
#include "happy.c"
*/
import "C"
import "fmt"

func main(){
a:=C.add(3, 4)
fmt.Println(a)
C.sayhi()
}

三、go语言的全局变量

全局变量的作用域是整个包,局部变量的作用域则只有对应的花括号内{};
全局变量需使用var来定义,在使用过程中尽量避免使用:=,因为在作用域中使用:=将会造成生成局部变量,而非对全局变量进行操作;原则是就近原则

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值